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.
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