2015-08-20 5 views
7

Ich habe eine Anforderung, um die Anzahl der Mitarbeiter wo Mitarbeiter Name enthält "Kumar" und Alter ist größer als 26. Ich verwende Java 8 Streams, um über die Sammlung zu iterieren und ich ' Ich bin in der Lage, eine Mitarbeiteranzahl mit der oben genannten Bedingung zu finden.Führen Sie Aktion in Stream der Operation in Java 8

Aber in der Zwischenzeit muss ich die Mitarbeiterdetails drucken.

Hier ist mein Code mit Java 8 Streams:

public static void main(String[] args) { 

    List<Employee> empList = new ArrayList<>(); 

    empList.add(new Employee("john kumar", 25)); 
    empList.add(new Employee("raja", 28)); 
    empList.add(new Employee("hari kumar", 30)); 

    long count = empList.stream().filter(e -> e.getName().contains("kumar")) 
          .filter(e -> e.getAge() > 26).count(); 
    System.out.println(count); 
} 

traditionelle Art und Weise:

public static void main(String[] args){ 
    List<Employee> empList = new ArrayList<>(); 

    empList.add(new Employee("john kumar", 25)); 
    empList.add(new Employee("raja", 28)); 
    empList.add(new Employee("hari kumar", 30)); 
    int count = 0; 
    for (Employee employee : empList) { 

     if(employee.getName().contains("kumar")){ 
      if(employee.getAge() > 26) 
      { 
       System.out.println("emp details :: " + employee.toString()); 
       count++; 
      } 
     } 
    } 
    System.out.println(count); 
} 

Was ich in der traditionellen Art und Weise bin Druck, möchte ich auch die gleichen mit Hilfe von Streams erreichen.

Wie kann ich bei der Verwendung von Streams innerhalb jeder Iteration eine Nachricht drucken?

Antwort

14

Sie könnten verwenden Sie die Stream.peek(action) Methode Informationen über jedes Objekt Stream zu protokollieren:

long count = empList.stream().filter(e -> e.getName().contains("kumar")) 
         .filter(e -> e.getAge() > 26) 
         .peek(System.out::println) 
         .count(); 

dieDie Methodeermöglicht das Ausführen einer Aktion für jedes Element aus dem Stream, wenn sie verbraucht werden. Die Aktion muss der Schnittstelle Consumer entsprechen: Nehmen Sie einen einzelnen Parameter t vom Typ T (Typ des Stream-Elements) und geben Sie void zurück.

+2

Es sollte betont werden, dass "peek" nur eine Aktion auf * verarbeitete * Elemente ausführt. Wenn Sie also eine kurzschließende Terminalaktion wie 'findFirst' verwenden, werden nicht unbedingt alle Elemente verarbeitet. Ferner kann "count()" die Verarbeitung vollständig überspringen, wenn die Größe vorhersehbar ist, z. ohne die 'Filter'. Die Java 9-Implementierung hat eine solche Optimierung ... – Holger

+0

Gibt es eine Möglichkeit, peek() zu steuern. In der Produktion möchte ich peek() -Methodenprotokolle deaktivieren. Eine Möglichkeit besteht darin, Code zu kommentieren, aber er benötigt Kompilierung von Code und Deployment. Irgendeine andere Idee ?. – Krishna

+0

@Krishna Die Idee ist nicht, 'peek' zu deaktivieren, sondern ein Logging-Framework zu verwenden, das in Entwicklung und Produktion (basierend auf einer Konfigurationsdatei) unterschiedlich protokolliert. Schau dir 'log4j' an. – Tunaki

2

eher unklar, was Sie eigentlich wollen, aber dies könnte helfen:
Lambdas (wie Ihr Predicate) auf zwei Arten geschrieben werden kann:
Ohne Klammern wie folgt aus: e -> e.getAge() > 26 oder

...filter(e -> { 
       //do whatever you want to do with e here 

       return e -> e.getAge() > 26; 
      })... 
+0

Sie möchten die Ausgabe von Stream 1 drucken, bevor Sie zum nächsten Datenstrom gehen. – Krishna