簡體   English   中英

Java 8 lambda謂詞鏈接?

[英]Java 8 lambda predicate chaining?

我無法編譯它,甚至可以鏈接謂詞lambdas?

Arrays.asList("1","2","3").stream().filter( (e -> e=="1" ).or(e-> e=="2") ).count();

或者唯一的方法是顯式創建一個謂詞,然后像這樣組合:

Predicate<String> isOne= e -> e=="1";
Arrays.asList("1","2","3").stream().filter( isOne.or(e -> e=="2") ).count();

或者是否有更多“功能優雅”的方式來實現同樣的目標?

可以使用:

((Predicate<String>) e -> e.equals("1")).or(e -> e.equals("2"))

但它不是很優雅。 如果您在線指定條件,只需使用一個lambda:

e -> e.equals("1") || e.equals("2")

我正在研究類似的謂詞鏈接問題,並提出了以下建議

public static <T> Predicate<T> chain (Function<T,Predicate<T>> mapFn, T[]args) {
    return Arrays.asList(args)
        .stream()
        .map(x->mapFn.apply(x))
        .reduce(p->false, Predicate::or);
}

鏈的第一個參數是lambda(Function),它返回一個lambda(Predicate),因此它需要幾個箭頭

public static void yourExample() {
    String[] filterVals = { "1", "2" };

    Arrays.asList("1","2","3")
        .stream()
        .filter(chain(x-> (y-> y.equals(x)), filterVals))
        .count();
}

為了比較,這是我想要實現的......

public static void myExample() {
    String[] suffixes = { ".png", ".bmp" };
    Predicate<String> p = chain (x-> y-> y.endsWith(x), suffixes);
    File[] graphics = new File("D:/TEMP").listFiles((dir,name)->p.test(name));
    Arrays.asList(graphics).forEach(System.out::println);
}

你可以使用魔術方法$:

<T> Predicate<T> $(Predicate<T> p) {
     return p;
}

Arrays.asList("1", "2", "3").stream().filter( $(e -> e=="1").or(e -> e=="2") ).count();

這只是@Chris Jester-Young答案的一小部分。 通過使用方法引用可以縮短表達式:

((Predicate<String>) "1"::equals).or("2"::equals)
Arrays.asList("1","2","3").stream().filter( Arrays.asList("1", "2")::contains).count();

是的方法“要么”是好主意

    public static void main(String[] args) {
        long count = Arrays.asList("1","2","3").stream().filter(either("1"::equals).or("2"::equals)).count();
        System.out.println(count);
    }

    private static <T> Predicate<T> either(Predicate<T> predicate) {
        return predicate;
    }

或者你可以使用import static java.util.function.Predicate.isEqual; 並寫入isEqual("1").or(isEqual("2"))

Predicate<String> pred1 =  "1"::equals;
Predicate<String> pred2 =  "2"::equals;

public void tester(){
      Arrays.asList("1","2","3").stream().filter(pred1.or(pred2)).count();
}

您可以將您的條件單獨移動,以便能夠以其他方式重新組合它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM