2016-03-07 15 views
5

स्ट्रीम करने के लिए एक सामान्य उदाहरण के साथ जावा 8 स्ट्रीम सिंटैक्स के चारों ओर अपना सिर प्राप्त करने का प्रयास कर रहा है। इस विषय पर अन्य समान प्रश्नों पर नज़र डालें, लेकिन मेरे समाधान से मेल खाने वाले किसी भी समाधान को नहीं मिला और मेरे लिए काम करेगा। मूल रूप से मैं नई धारा एपीआई का उपयोग करने दो नेस्टेड छोरों के साथ निम्नलिखित स्निपेट refactor करने के लिए कोशिश कर रहा हूँ:जावा 8 नेस्टेड लूप

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; 

प्रबंधित इस जो शून्य रिटर्न साथ आने के लिए:

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

क्या धारा साथ कुछ गड़बड़ है ऊपर वाक्यविन्यास और मुझे क्या याद आ रही है?

+6

एक सामान्य रूप में सलाह, पहले 'के लिए' देखने के व्यवहार को रोकें। एक बार जब आप इसे समझ लेते हैं और हमेशा दूसरे स्ट्रीम ऑपरेशंस को देखते हैं, तो आपको शायद इस तरह के प्रश्न पूछने की आवश्यकता नहीं होगी। इसके अलावा, 'wheel.isWorking() == true' जैसी सशर्तियों का उपयोग न करें, वे व्यर्थ हैं। बस 'wheel.isWorking()' का उपयोग करें, यह स्वयं के लिए बोलता है। – Holger

उत्तर

9

आप दो टर्मिनल परिचालन नहीं कर सकते - forEach और collect उसी Stream पर।

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

समस्या है, तो आप ListforEach अंदर और (रों) बना रहे हैं:

बजाय, आप प्रत्येक कार के लिए जाँच अगर यह एक मिलान काम कर व्हील है, के आधार पर फ़िल्टर करने के लिए कारों सूची की ज़रूरत है forEachvoid देता है। इस के बराबर होगा पाश के लिए निम्नलिखित:

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) !!! 

आप cars धारा पर filter का उपयोग करें और धारा फ़िल्टर्ड पर उपयोग collect एकत्र कर पाया है वांछित परिणाम प्राप्त करने के लिए:

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

List<Car> filteredCars = cars.stream().filter(carCheck).collect(Collectors.toList()); 
संबंधित मुद्दे