最近、私は新しいjava8機能を使いこなしています。なぜPredicate.isEqualはそのまま実装されていますか?
Stream.filter
でいくつかのものを試して、私は私がisEqual
メソッドの次の実装見つかっているPredicate.java
のソースに出くわした:: object -> targetRef.equals(object);
:私は不思議作ら何
/**
* Returns a predicate that tests if two arguments are equal according
* to {@link Objects#equals(Object, Object)}.
*
* @param <T> the type of arguments to the predicate
* @param targetRef the object reference with which to compare for equality,
* which may be {@code null}
* @return a predicate that tests if two arguments are equal according
* to {@link Objects#equals(Object, Object)}
*/
static <T> Predicate<T> isEqual(Object targetRef) {
return (null == targetRef)
? Objects::isNull
: object -> targetRef.equals(object);
}
は、この行でした。
たぶん私は、大規模にこれをoverthinkingていますが、私はその行がこのような: targetRef::equals;
なかった理由を考えて、すぐに役立つことができませんでした:
static <T> Predicate<T> isEqual(Object targetRef) {
return (null == targetRef)
? Objects::isNull
: targetRef::equals;
}
は、そうでない私には、ラムダの不要な創造です。
私が何かを逃していない限り、私には同じことがあります。 (彼らは同じですか?)現在の実装が選ばれた理由はありますか?それともちょうど見過ごされているか、誰も本当に気にしていない、これは信じられないほど小さなものです。
実際には、ボーナスの問題が発生すると推測されます。一方の方法でもう一方の方法を使用することに利点はありますか?ある種の(おそらく非常に小さい)パフォーマンスボーナスのように?
メソッド参照は明示的ラムダと同じ研削機で終わる。両方に同じ実装方法が必要です。 –
@MarkoTopolnikはい、メソッド参照を渡すのではなく、lamba(単にメソッドを呼び出すだけです)を作成することで、不要なメソッド呼び出し(ラムダ)をチェーンに追加することはありませんか? (ストリームにはたくさんのアイテムが含まれているとおそらく多く呼ばれるでしょう) –
私は誰もこれに答えることはできないと思います。コードを書いた人がいると思います。そう確か。 – Tunaki