2016-09-22 35 views
4

私は「Java SE 8 for the Really Impatient」を読んでいます。興味深いコードがあります。それはこのようなものだ:Streamを使用したJava 8パターン述語 - どのように変数が推測されますか?

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

私はちょうどasPredicate方法が

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

ようなものになるだろうと思った。しかし、実際の実装では、私は私のようなものを使用することができることを知っているこの

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

のようなものですこれは完全に合法です:

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

しかし、私の質問は、ストリームがパターンインスタンスにStringを渡す方法ですか?どのように "クリスティアン"、 "ダニエル"、 "オルティス"、それぞれの方法s -> matcher(s).find()に渡される "クエリャル"。私はどのように文字列が渡され、asPredicateメソッドの変数sになるかを意味します。

+4

、なぜそれがあなたの代わりに' 'のsomeMethod()を呼び出すことができます謎ですこれは 'return certainKindOfExpression'を含み、' someMethod() 'の結果を' .filter(...) 'に渡しますか?ラムダ式には特別なことではありません。ラムダ式が 'filter'でどのように動作するかを理解していれば、同じラムダ式が' return'ステートメントでどのように動作するかを理解する必要があります。もちろん、ラムダのパラメータ 's'または' a'を呼び出しても違いはありません。 – Holger

答えて

4

Predicateインタフェースを使用すると、Stream<String>にフィルタリングしているので、この場合はTは、Stringタイプである1つの抽象メソッドboolean test(T t)を定義する機能インタフェースです。言い換えれば、コードは同等です:あなたは.filter(...) ``に `certainKindOfExpression`を渡すことができることを知っている

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

よろしくお願いいたします。 – chiperortiz

関連する問題