iterator jako final i ustawainie go na poczatku listy.

0
List<Employee> query6 = db.query(new Predicate<Employee>() {
			public boolean match(Employee employee) {        	    
				boolean result6 = employee.getDepartment().getLocation().getCountry().equals("US");
				return result6;        	    	
			}
		});
		
		Iterator<Employee> it = query6.iterator();
		System.out.println("element next is "+it.next());
		double total_sal=0;
		while(it.hasNext()) {
			total_sal=total_sal+it.next().getSalary();
		}
			
		final double average_sal = total_sal/query6.size();

		//System.out.println("element next is "+query6.get(0));
		
		it = query6.iterator(); 
		System.out.println("element next is "+it.next().getSalary());
		boolean result7 = it.next().getSalary();
		
		//System.out.println("element next is "+query6.iterator().next());
		
		
		List<Employee> query7 = db.query(new Predicate<Employee>() {
			public boolean match(Employee employee) {
					boolean result8 = it.next().getSalary()>average_sal;
					boolean result7 =average_sal>0;
					
					return result7;
			}
		});
		listResult(query7);
	}

wywala mi bład ze local variable is accessed from within inner class need to be final
jednak jak dam final zto znowu nie moge iteratora ustawic na poczatek: tak "it = query6.iterator(); ";
Ani tak ani tak, jestem w martwym punkcie !

0

@PiotrekB:
Nie możesz go ustawić? Może mam jakąś zaćmę, a bez Javy tego nie sprawdzę, ale... Raz przecież możesz ustawić zmienną final, inicjalizując ją zaraz przy jej definicji. A że nie możesz jej potem ustawić drugi raz, w drugim wywołaniu query6.iterator()? A co za problem? Zadeklaruj po prostu drugi iterator. Też może być final, jeśli trzeba. I używaj go w drugiej części kodu (od drugiego reseta dalej).

W ogóle takie wielokrotne ustawianie jednej zmiennej lokalnej, która nie jest ani zmienną sterującą w pętli, ani nie służy do zbierania informacji -- to jeden ze złych zapachów w kodzie.

W ogóle coś mi w tym kodzie śmierdzi. query6, query7? result6, result7, result8? Cóż to? Może czas podzielić metodę i zmienić nazwy zmiennych, czy też... użyć pętli. Tak tylko ostrzegam. Taka wielka metoda z dziwnymi nazwami zmiennych może Ci sprawić jeszcze niejeden kłopot.

0

Dzieki za uwagi, co do moich nazw to sie zgdazam jedna zalezy to od programisty, ja naprzykład mam mnostwo funkcji i sa one ponumerowane, pracuje w IDE wyposazonym w podswietlanie składni wszystkich podobnych wyrazen, wiec zmienne chociaz sie troszeczke roznia jest mi to obojetne poniewaz rozrozniam je po kliknieciach i kolorach. Drugiego Iteratora wlasnie chcialem sobie darowac , stad moje pytanie. Jednak znalazłem metode "remove" ktora zeruje iterator :)
jeszcze raz dziekuje za uwagi, na pewno sie przydadza.
pozdrawiam serdecznie

0

Metoda remove nie zeruje iteratora, a usuwa aktualny element z kolekcji.

0

Tuż przed query7 możesz sobie stworzyć zmienną final np. it2 i zainicjować ją sobie bieżącą wartością it, a sama it nie musi być final. Zauważ, że new Predicate<Employee>() {...} jest instrukcją utworzenia instancji obiektu anonimowej i lokalnej klasy wewnętrznej dziedziczącej po Predicate<Employee>.

1 użytkowników online, w tym zalogowanych: 0, gości: 1