現在のメソッド参照とは逆のメソッド参照を作成する方法があります。メソッド参照をaに明示的にキャストPredicate
し、negate
関数を使用して変換する方法を示す、以下の@vlasecの回答を参照してください。それは、他のいくつかのそれほど面倒ではない方法の1つです。
これの反対:
Stream<String> s = ...;
int emptyStrings = s.filter(String::isEmpty).count();
これは:
Stream<String> s = ...;
int notEmptyStrings = s.filter(((Predicate<String>) String::isEmpty).negate()).count()
またはこれ:
Stream<String> s = ...;
int notEmptyStrings = s.filter( it -> !it.isEmpty() ).count();
個人it -> !it.isEmpty()
的には、長い冗長な明示的キャストよりも読みやすく、否定する方が明確なので、後者の手法を好みます。
述語を作成して再利用することもできます。
Predicate<String> notEmpty = (String it) -> !it.isEmpty();
Stream<String> s = ...;
int notEmptyStrings = s.filter(notEmpty).count();
または、コレクションまたは配列がある場合は、単純で、オーバーヘッドが少なく、***高速である可能性があるforループを使用します。
int notEmpty = 0;
for(String s : list) if(!s.isEmpty()) notEmpty++;
*より高速なものを知りたい場合は、JMH http://openjdk.java.net/projects/code-tools/jmhを使用し、すべてのJVM最適化を回避しない限り、手動のベンチマークコードを回避します。Java8 :ストリームのパフォーマンスを参照してください。vsコレクション
** forループテクニックの方が速いことを示唆したことで、私は不安定になっています。これは、ストリームの作成を排除し、別のメソッド呼び出し(述語の負の関数)の使用を排除し、一時的なアキュムレーターリスト/カウンターを排除します。したがって、最後の構成によって保存されるいくつかのことは、それをより速くする可能性があります。
私はそれがより速くなくても、よりシンプルでより良いと思います。ハンマーと釘が必要な場合は、チェーンソーと接着剤を持ち込まないでください。あなた方の何人かがそれに問題を抱えているのを知っています
ウィッシュリスト:Stream
JavaユーザーがJava 関数に慣れてきているため、Java 関数が少し進化することを期待しています。たとえば、Streamの「count」メソッドはaを受け入れるPredicate
ことができるため、これは次のように直接実行できます。
Stream<String> s = ...;
int notEmptyStrings = s.count(it -> !it.isEmpty());
or
List<String> list = ...;
int notEmptyStrings = lists.count(it -> !it.isEmpty());
Predicate.not(Predicate)
メソッドの追加をカバーしています。しかし、その問題は未解決のままなので、Java 12で(もしあれば)できるだけ早くこれを確認します。