述語としてメソッド参照を実装する方法?

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()この方法は一度だけ呼び出されます。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=313031&siteId=1