web-dev-qa-db-ja.com

常にtrueを返す組み込みJava 8述語?

Google Guavaには、 常にtrue という条件があります。 Java 8にはPredicateに類似したものがありますか? (foo)->{return true;}を使用できることは知っていますが、Collections.emptySet()に類似した事前に作成されたものが必要です。

113
Garret Wilson

Java 8には、組み込みのalways-trueおよびalways-false述語はありません。これらを記述する最も簡潔な方法は、

x -> true

そして

x -> false

これらを比較してください

Predicates.alwaysTrue() // Guava

そして最後に匿名の内部クラスに:

new Predicate<Object>() {
    public boolean test(Object x) {
        return true;
    }
}

おそらく、Guavaにこれらの組み込み述語があるのは、静的メソッド呼び出しが匿名の内部クラスよりも大きな構文上の利点があるためです。 Java 8では、ラムダ構文が非常に簡潔であるため、静的メソッド呼び出しを記述する構文の欠点があります。

ただし、これは単なる構文上の比較です。複数のクラスにまたがるx -> trueオカレンスと比較して、それぞれが独自の述語インスタンスを作成する場合と比較して、単一のグローバルで常に真の述語が存在する場合、おそらく小さなスペースの利点があります。これはあなたが心配していることですか?節約は説得力のあるものではなかったので、おそらくそもそも追加されなかったのでしょう。ただし、将来のリリースでは再検討される可能性があります。

更新2015-04-24

Predicate.alwaysTrueRunnable.noopなどのさまざまな静的な名前付き関数の追加を検討しており、今後のバージョンのJavaにはこれ以上追加しないことにしました。 _ SE。

確かに、名前と書かれたラムダを持っているものには何らかの値がありますが、この値は非常に小さいです。人々はx -> true() -> { }の読み書きの方法を学び、その使い方が慣用的になることを期待しています。 x -> x上のFunction.identity()の値でさえ疑わしいです。

書き出されたラムダを評価する代わりに既存の関数を再利用することには、わずかなパフォーマンス上の利点がありますが、これらの種類の関数の使用は非常に小さく、そのような利点は無視でき、APIの肥大化の価値はありません。

Holgerは、Predicate.orなどの合成関数を最適化する可能性についてもコメントで言及しました。これも考慮されました( JDK-8067971 )が、やや壊れやすく、エラーが発生しやすく、実装の労力に見合わないほど頻繁に発生すると見なされました。

こちらもご覧ください Lambda FAQ entry。

146
Stuart Marks

グアバなし

Boolean.TRUE::booleanValue
4
boriselec