1. ホーム
  2. java

[解決済み] 常にtrueを返すJava 8の組み込み述語?

2022-04-28 13:14:43

質問

Google Guavaは、述語として は常に true . Java 8 では Predicate ? を使うことができるのは知っています。 (foo)->{return true;} のような、あらかじめ用意されたものが欲しいのです。 Collections.emptySet() .

解決方法は?

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.alwaysTrue , Runnable.noop などがあり、今後のJava SEのバージョンでは、これ以上追加しないことにしました。

確かに、名前を持つものと書き出しのラムダとでは価値が違いますが、その価値は非常に小さいものです。私たちは、人々が読み書きの方法を学ぶことを期待しています x -> true() -> { } と、その使い方が慣用化されることです。の値でさえも Function.identity() オーバー x -> x は疑問が残る。

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

また、Holger氏はコメントで、以下のような合成関数を最適化する可能性についても言及しています。 Predicate.or といった具合です。これも検討されました( JDK-8067971 しかし、脆弱でエラーが発生しやすく、また発生頻度も低いため、実装する価値がないと判断されました。

こちらもご覧ください ラムダFAQ のエントリーをご覧ください。