web-dev-qa-db-ja.com

ラムダ述語を否定するにはどうすればよいですか?

文字列のストリームがあるとしましょう。

_final Stream<String> stream = ...;
_

トリミングした後、各空の文字列を除外します。

_stream
    .filter(Objects::nonNull)
    .map(String::trim)
    .filter(v -> !v.isEmpty());
_

v -> !v.isEmpty()の部分を置き換えるために Predicate#negate() を適用する方法はありますか?

_.filter(((Predicate) String::isEmpty).negate()) // not compile
_
27
Jin Kwon

.filter(((Predicate<String>) String::isEmpty).negate())を実行する必要があります

必要に応じて、次を定義できます

_static<T> Predicate<T> not(Predicate<T> p) {
    return t -> !p.test(t);
}
_

その後

_.filter(not(String::isEmpty))
_

しかし、私はv -> !v.isEmpty()に固執します

29
Misha

これを機能させるには、Predicate<String>にキャストする必要があるようです:

.filter(((Predicate<String>) (String::isEmpty)).negate())

もちろん、この場合はラムダを使用する方がはるかに短くなります。

.filter(s -> ! s.isEmpty())
7
tobias_k

自分でクラスを作成する代わりに、 durian ユーティリティライブラリを使用します。 メソッドandorおよびnotはもちろんたくさんあります。

import static com.diffplug.common.base.Predicates.not;

stream
.filter(Objects::nonNull)
.map(String::trim)
.filter(not(String::isEmpty));
2
Cherry