user3303411:
私はjava8に新しいですし、私は、コードのこの部分を理解しようとしていました。これは、コードの一部です:
Stream.of("A", "B", "C").anyMatch(someObj.getStringValue()::equalsIgnoreCase)
someObj.getStringValue()
参照いくつかのオブジェクトとgetStringValue()
戻っていくつかの文字列値。
渡されるメソッド参照の等価な述語は何ですかanyMatch(...)
?
私の理解では、これはと同等になりました。
Predicate<String> p = new Predicate<String>() {
@Override
public boolean test(String t) {
return someObject.getStringValue().equalsIgnoreCase(t);
}
}
Stream.of("A", "B", "C").anyMatch(p)
これで、私はエラーを取得する「ローカル変数someObject
を囲むスコープで定義されたが、最終的または効果的に最終でなければなりません。」この上の任意の説明が理解されます。
アンドレアス:
someObj.getStringValue()
同等のコードは、あろうように、発現は、外部評価されます。
final String x = someObject.getStringValue();
Predicate<String> p = new Predicate<String>() {
@Override
public boolean test(String t) {
return x.equalsIgnoreCase(t);
}
}
Stream.of("A", "B", "C").anyMatch(p)
ローカル変数はどこx
あまりにも「匿名」です。
このため、someObject
する必要はありません効果的に、最終的な。
あなたは、のために、この動作を確認することができますラムダ式をブレークポイントの内部を置くことによって、デバッガでgetStringValue()
。にもかかわらずtest()
(ストリーム3つの要素を持ち、一致を仮定しないため)メソッドは3回呼び出され、getStringValue()
この方法は一度だけ呼び出されます。