2016-04-29 17 views
0

Wie kann ich die folgende for-Schleife konvertieren, um ein Java-Lambda mit Streams zu verwenden?Wie kann ich eine for-Schleife mit einem Lambda und Stream in Java ersetzen?

List<Fruit> fruits = createFruitArrayList(); // creates a list of fruits 
Fruit largeApple = null; // holds the largest apple so far for 
for (Fruit fruit : fruits) { 
    if (fruit.getType() == “Apple”) { 
    if (largeApple == null || 
    largeApple.size() < fruit.size()) { 
     largeApple = fruit; 
    } 
    } 
} 
+0

Verbesserte Formatierung und zusätzliche beschreibende Wörter zur Unterstützung bei der Frage. – AlBlue

Antwort

0

Das sieht aus wie es funktioniert:

public void test() { 
    // creates a list of fruits 
    List<Fruit> fruits = Arrays.asList(
      new Fruit("Apple", 10), 
      new Fruit("Apple", 14), 
      new Fruit("Pear", 4)); 
    // Old style. 
    // holds the largest apple so far 
    Fruit largeApple = null; 
    for (Fruit fruit : fruits) { 
     if (fruit.getType().equals("Apple")) { 
      if (largeApple == null 
        || largeApple.size() < fruit.size()) { 
       largeApple = fruit; 
      } 
     } 
    } 
    System.out.println("Old: " + largeApple); 
    // New Style. 
    Optional<Fruit> max = fruits.stream() 
      .filter(f -> f.type.equals("Apple")) 
      .max(Comparator.comparing(f -> f.size)); 
    System.out.println("Lambda: " + max); 

} 

BTW: Ihr Beispielcode ist schrecklich - bitte eine Arbeitsprobe in Echt syntaktisch korrekte Java schreiben.

+0

Danke. Dieser Beispielcode ist eine Beispielfrage, die mein Lehrer uns in der Schule gegeben hat. – DamiAbiola

+0

@DamiAbiola - Dann kennt entweder Ihr Lehrer kein Java oder Sie haben es nicht richtig kopiert. – OldCurmudgeon

1

Sie können die comparator verwenden Sie die beiden Werte

Comparator<Fruit> comp = (fruit1, fruit2) -> Integer.compare(fruit1.size(), fruit2.size()); 
Fruit largeApple = fruits.stream().max(comp).get(); 

Auch die Art und Weise Sie Strings vergleichen, um zu vergleichen, ist falsch

if (fruit.getType() == “Apple”) 

Was proberly Sie

if (fruit.getType().equals("Apple")) 

Für weitere Informationen wünschen Schauen Sie sich dazu die folgende Frage an: How do I compare strings in Java?

1

Gefahr, Will Robinson! Verwenden Sie nicht ==, um Strings zu vergleichen! Verwenden Sie equals().

Das heißt, ist dieser Code in der Schleife äquivalent:

Fruit largestApple = fruits.stream() 
    .filter(f -> f.getType().equals("Apple")) 
    .max(Comparator.comparing(Fruit::size)) 
    .orElse(null); 

Hinweis ist die Verwendung eines Verfahrens Referenz (anstelle eines lambda) als Parameter zu übergeben comparing().

Verwandte Themen