2016-03-07 12 views
5

Basit bir örnekle kafamı Java 8 akışları sözdizimini elde etmeye çalışıyorum. Bu konuyla ilgili diğer benzer sorulara bir göz attım, ama benim örneğimle eşleşecek ve benim için çalışacak herhangi bir çözüm bulamadım. Temelde ben yeni akış API kullanmak için iç içe geçmiş iki döngüler ile şu ön planı ayrı çalışıyorum: YönetilenJava 8 yuvalanmış döngüler yayınlanacak

List<Car> filteredCars = new ArrayList<>(); 
    for (Car car : cars) { 

     for (Wheel wheel : wheels) { 

      if (car.getColor() == wheel.getColor() && 
        wheel.isWorking() == true) { 

       filteredCars.add(car); 
       break; 
      } 
     } 
    } 

    return filteredCars; 

geçersiz döndürür bu ile gelip:

return cars.stream().forEach(
      car -> wheels.stream() 
      .filter(wheel -> wheel.getColor() == car.getColor() && 
        wheel.isWorking() == true) 
      .collect(Collectors.toList())); 

Ne akışı yanlıştır Yukarıdaki sözdizimi ve ne eksik?

+6

:

for (Car car : cars) { List<Car> filteredCars = new ArrayList<>(); for (Wheel wheel : wheels) { if (car.getColor() == wheel.getColor() && wheel.isWorking() == true) { filteredCars.add(car); break; } } } return filteredCars; // whoops cannot be accessed (scope) !!! 

Sen istenen sonuçları elde etmek süzülmüş akışta cars akışı filter kullanmak ve kullanımını collect toplamak olabilir tavsiye, ilk bakışta 'forEach' davranışını durdurun. Bunu anladıktan ve her zaman önce diğer akış işlemlerine baktıktan sonra, artık böyle bir soru sormak zorunda kalmayacaksınız. Bunun yanı sıra, 'wheel.isWorking() == true' gibi koşullu kullanmayın, bunlar anlamsızdır. Sadece 'wheel.isWorking()' kullanın, kendisi için konuşur. – Holger

cevap

9

Aynı anda forEach ve collect iki terminal işlemini gerçekleştiremezsiniz Stream.

List<Car> filteredCars = 
    cars.stream() 
     .filter (
      car -> wheels.stream() 
         .anyMatch(wheel -> wheel.getColor() == car.getColor() &&  
              wheel.isWorking())) 
     .collect(Collectors.toList()); 
2

sorundur, sen List (ler) forEach içinde ve oluştururken:

yerine, bunu bir eşleştirme çalışma tekerleği varsa her araç için kontrol ederek arabalar listesine filtre gerekir forEach, void değerini döndürür. Bu eşdeğer olacaktır döngü için aşağıdaki: Genel olarak

Predicate<Car> carCheck = car -> wheels.stream().anyMatch(wheel -> car.getColor() == wheel.getColor() && wheel.isWorking()); 

List<Car> filteredCars = cars.stream().filter(carCheck).collect(Collectors.toList());