2016-09-22 2 views
4

Ich lese "Java SE 8 für die wirklich Ungeduldig" und ich sehe einige seltsame Code. Es ist so:Java 8 Musterprädikat mit Stream - wie wird die Variable abgeleitet?

final Pattern pattern = Pattern.compile("....."); 
final long count = Stream.of("Cristian","Daniel","Ortiz","Cuellar") 
     .filter(pattern.asPredicate()) 
     .count(); 

Ich dachte nur, dass asPredicate Methode so etwas wie

public boolean asPredicate(String stringToMatch){ 
    ..... 
} 

wäre Aber die eigentliche Implementierung ist wie dies

public Predicate<String>asPredicate(){ 
    return s -> matcher(s).find(); 
} 

Ich weiß, dass ich so etwas wie verwenden könnte das ist vollkommen legal:

final long count = Stream.of("Cristian","Daniel","Ortiz","Cuellar") 
     .filter(a->pattern.matcher(a).find()) 
     .count(); 

Aber meine Frage ist, wie der Strom die Zeichenfolge an die Musterinstanz übergibt? wie "Cristian", "Daniel", "Ortiz", "Cuellar" jeweils auf das Verfahren s -> matcher(s).find() übergeben werden. Ich meine, wie die Strings irgendwie weitergegeben werden und die s Variable der asPredicate-Methode werden.

+4

Sie wissen, dass Sie 'certainKindOfExpression' zu' .filter passieren kann (...) ', also warum ist es ein Geheimnis, das Sie anrufen können' irgendeinemethode() 'statt , die eine 'return bestimmteKindOfExpression' enthält und dann das Ergebnis von' someMethod() 'an' .filter (...) '? Das ist nicht besonders für Lambda-Ausdrücke. Wenn Sie verstehen, wie die Übergabe eines Lambda-Ausdrucks in 'filter' funktioniert, sollten Sie verstehen, wie derselbe Lambda-Ausdruck mit einer' return'-Anweisung funktioniert. Ob Sie den Lambda-Parameter 's' oder' a' aufrufen, macht natürlich keine Unterschiede. – Holger

Antwort

4

Die Predicate Schnittstelle ist eine funktionale Schnittstelle, die boolean test(T t) eine abstrakte Methode definiert, wo T in diesem Fall ist der String Typ, da Sie auf einem Stream<String> sind Filterung. Mit anderen Worten, ist der Code entspricht:

final long count = Stream.of("Cristian","Daniel","Ortiz","Cuellar") 
    .filter(new Predicate<String>() { 
     public boolean test(String s) { 
      return matcher(s).find(); 
     } 
    }) 
    .count(); 
+0

super danke. – chiperortiz