Java Stream :: *匹配操作的通用声明

时间:2015-11-12 21:42:52

标签: java generics java-8 functional-interface

我想创建一个通用test()函数来演示Stream操作allMatchanyMatchnoneMatch。它可能看起来像这样(它没有编译):

import java.util.stream.*;
import java.util.function.*;

public class Tester {
    void test(Function<Predicate<Integer>, Boolean> matcher, int val) {
        System.out.println(
            Stream.of(1,2,3,4,5).matcher(n -> n < val));
    }
    public static void main(String[] args) {
        test(Stream::allMatch, 10);
        test(Stream::allMatch, 4);
        test(Stream::anyMatch, 2);
        test(Stream::anyMatch, 0);
        test(Stream::noneMatch, 0);
        test(Stream::noneMatch, 5);
    }
}

(我认为)我的挑战在于定义matcher,这可能需要是通用的,而不是我在这里做的方式。我还不确定是否可以拨打main()中显示的电话。

我甚至不确定这可以做到,所以我很欣赏任何见解。

1 个答案:

答案 0 :(得分:4)

以下作品:

static void test(
      BiPredicate<Stream<Integer>, Predicate<Integer>> bipredicate, int val) {
    System.out.println(bipredicate.test(
         IntStream.rangeClosed(1, 5).boxed(), n -> n < val));
}

public static void main(String[] args) {
    test(Stream::allMatch, 10);
    test(Stream::allMatch, 4);
    test(Stream::anyMatch, 2);
    test(Stream::anyMatch, 0);
    test(Stream::noneMatch, 0);
    test(Stream::noneMatch, 5);
}

...但如果关键是演示这些事情做了什么,你可能会更好地写出更直接的

System.out.println(IntStream.rangeClosed(1, 5).allMatch(n -> n < 10));

.. etcetera,它更容易阅读。