2015-07-29 11 views
6

Bei der Verwendung von filter(Predicate<? super T> predicate) Anrufe in Java 8 Lambda-Ausdrücke, bin ich in zwei Gedanken darüber, ob alle Predicate Logik in einen Anruf zu setzen, oder filter(Predicate<? super T> predicate) Anrufe zu ketten, um die Lesbarkeit wo angemessen.Java 8 lambdas mehrere Filteraufrufe

Ich nehme an, dass filter(Predicate<? super T> predicate) Anrufe Verkettungs billig sein wird, da sie noch nicht einen Terminator erfüllt, so würde auf der Seite der Lesbarkeit irren, aber ich bin nicht genug in meinem Wissen der Streams API zuversichtlich zu verstehen, was den Handel -offs sind.

Mit Hilfe des folgenden Beispiels (man denke auch komplexere Prädikaten), die Umsetzung ist überlegen: List<Person> usingOneFilter oder List<Person> usingTwoFilters?

import java.util.Arrays; 
import java.util.List; 
import java.util.stream.Collectors; 

public class SEExample { 

    private static class Person { 
     private final int age; 
     private final int heightInCm; 

     public Person(int age, int heightInCm) { 
      this.age = age; 
      this.heightInCm = heightInCm; 
     } 

     public int getAge() { 
      return age; 
     } 

     public int getHeight() { 
      return heightInCm; 
     } 
    } 

    public static void main(String[] args) { 
     List<Person> people = Arrays.asList(
       new Person(14, 140), 
       new Person(15, 140), 
       new Person(16, 150), 
       new Person(17, 120)); 
     List<Person> usingOneFilter = people 
       .stream() 
       .filter(p -> p.getAge() >= 16 && p.getHeight() >= 130) 
       .collect(Collectors.toList()); 
     List<Person> usingTwoFilters = people 
       .stream() 
       .filter(p -> p.getAge() >= 16) 
       .filter(p -> p.getHeight() >= 130) 
       .collect(Collectors.toList()); 
    } 

} 
+2

Sechs von eins, ein halbes Dutzend der anderen. Kein wirklicher Unterschied; ist egal. –

+0

Hallo Louis, danke für deine Eingabe. Von deinem Kommentar werde ich annehmen, dass es aus Performance-Sicht ziemlich gleich ist. Würden Sie in diesem Fall nicht zustimmen, dass mehrere Filteraufrufe die Lesbarkeit verbessern könnten, insbesondere wenn dort eine Menge boolescher Logik vor sich geht? –

+1

Wahrscheinlich? Ich würde den konkreten Fall sehen müssen, und es ist definitiv etwas anderes Entwickler werden unterschiedliche Meinungen zu haben. –

Antwort

10

In so einem kleinen Beispiel denke ich, Lesbarkeit ist nicht wirklich gefährdet, aber ich bevorzuge immer noch separate Filtermethoden. Sicher, wenn es etwas komplexer ist.

Dies ist in der Tat nicht sehr teuer. Es gibt keinen Grund, sie zu "optimieren", es sei denn, Sie haben ein Leistungsproblem und das Profiling zeigt, dass dies der Engpass ist. Aber das ist extrem unwahrscheinlich.

Verwandte Themen