[解決済み] 常にtrueを返すJava 8の組み込み述語?
質問
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 のエントリーをご覧ください。
関連
-
スレッド "main" で例外発生 java.lang.ArrayIndexOutOfBoundsException: 4 at text.Division.main(Divisi
-
[解決済み] 整数の平方根が整数であるかどうかを判断する最速の方法
-
[解決済み] Java: List<String> を join()d String に変換する。
-
[解決済み] 述語による最初の要素の検索
-
[解決済み] Mapを実装し、挿入順序を保持するJavaクラス?
-
[解決済み] Java 8 Iterable.forEach() vs foreachループ
-
[解決済み] メソッド参照述語を否定する方法
-
[解決済み】Javaではfinallyブロックは必ず実行されるのですか?
-
[解決済み】Mac OS Xでは、Javaはどこにインストールされていますか?
-
[解決済み】Java 8 Lambda関数が例外を投げる?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
エラー java.util.NoSuchElementException
-
スレッド "main "での例外をEclipseで解決 java.lang.Error: 未解決のコンパイル問題、コンパイラとパッケージの不整合
-
スキャナは、タイプに解決することはできません最もルーキー初心者の質問
-
VMの初期化中にエラーが発生しました java/lang/NoClassDefFoundError: java/lang/Object
-
spring-boot 401 このリソースにアクセスするには完全な認証が必要です エラー解決
-
[オリジナル】java学習ノート【II】よくあるエラー クラスパス上のクラスファイルが見つからない、またはアクセスできない場合
-
java.lang.NoClassDefFoundError: org.apache.jasper.el.ELContextImpl クラスを初期化できませんでした。
-
Error: java.lang.NoClassDefFoundError: クラス XXXX を初期化できませんでした
-
javax.net.ssl.SSLException: 読み取りエラー: ssl=0xdeae5100: システムコール中の I/O エラー、接続 res
-
Java(1)仕上げの基本概念+eclipseのインストール構成