Java 8 lambda 谓词链接?

2022-09-01 05:01:52

我无法让它编译,甚至有可能链接谓词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();

还是有更“功能优雅”的方式来实现同样的事情?


答案 1

您可以使用

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

但它不是很优雅。如果您要以内联方式指定条件,则只需使用一个 lambda:

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

答案 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(函数),它返回一个lambda(谓词),所以它需要几个箭头

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);
}

推荐