418

Java 8 では、メソッド参照を使用してストリームをフィルタリングできます。次に例を示します。

Stream<String> s = ...;
long emptyStrings = s.filter(String::isEmpty).count();

既存のメソッド参照の否定であるメソッド参照を作成する方法はありますか。つまり、次のようなものです。

long nonEmptyStrings = s.filter(not(String::isEmpty)).count();

以下のようなメソッドを作成できましたnotが、JDK が同様のものを提供しているかどうか疑問に思っていました。

static <T> Predicate<T> not(Predicate<T> p) { return o -> !p.test(o); }
4

12 に答える 12

237

メソッド参照をインラインで使用できるように、次のものを静的にインポートする予定です。

public static <T> Predicate<T> not(Predicate<T> t) {
    return t.negate();
}

例えば

Stream<String> s = ...;
long nonEmptyStrings = s.filter(not(String::isEmpty)).count();

更新: Java-11 以降、JDK には同様のソリューションが組み込まれています。

于 2014-03-18T22:26:08.990 に答える
51

他の人の回答と個人的な経験に基づいて構築する:

Predicate<String> blank = String::isEmpty;
content.stream()
       .filter(blank.negate())
于 2015-04-01T21:37:06.523 に答える
18

別のオプションは、あいまいでないコンテキストでラムダ キャストを 1 つのクラスに利用することです。

public static class Lambdas {
    public static <T> Predicate<T> as(Predicate<T> predicate){
        return predicate;
    }

    public static <T> Consumer<T> as(Consumer<T> consumer){
        return consumer;
    }

    public static <T> Supplier<T> as(Supplier<T> supplier){
        return supplier;
    }

    public static <T, R> Function<T, R> as(Function<T, R> function){
        return function;
    }

}

...そして、ユーティリティクラスを静的にインポートします。

stream.filter(as(String::isEmpty).negate())
于 2015-05-27T07:03:22.823 に答える
4

Eclipse コレクションの述語を使用できます

MutableList<String> strings = Lists.mutable.empty();
int nonEmptyStrings = strings.count(Predicates.not(String::isEmpty));

から文字列を変更できない場合List:

List<String> strings = new ArrayList<>();
int nonEmptyStrings = ListAdapter.adapt(strings).count(Predicates.not(String::isEmpty));

の否定のみが必要な場合は、String.isEmpty()も使用できますStringPredicates.notEmpty()

注: 私は Eclipse Collections の寄稿者です。

于 2016-03-27T00:11:36.620 に答える