Java 8 - 使用BiPredicate进行过滤

use*_*910 9 java lambda functional-programming predicate filter

我有一个整数流,我想找到两个数字,其总和等于另一个数字.所以我想出了以下解决方案:

BiPredicate<Integer, Integer> p = (price1, price2) -> price1.intValue() + price2.intValue() == moneyQty;
flavoursPrices.filter(p);
Run Code Online (Sandbox Code Playgroud)

但是过滤方法没有收到BiPredicate.为什么不?有什么替代方案?

Mat*_*att 11

您仍然可以使用Bipredicate.filter-method需要的参数是Predicate,所以这里是一个如何使用这个BiPredicate的例子:

 BiPredicate<Integer, Integer> p = (price1, price2) -> price1.intValue() + price2.intValue() == moneyQty;

flavoursPrices.stream().filter(el->p.test(el.price1,el.price2));
Run Code Online (Sandbox Code Playgroud)

在此示例中,flavoursPrices必须是List.

我们正在使用的lambda:

el->p.test(el.price1,el.price2)
Run Code Online (Sandbox Code Playgroud)

正在替换匿名内部类声明,用于从BiPredicate中创建新的谓词:

 Predicate<Integer> arg =new Predicate<Integer>() {
        @Override
        public boolean test(Element el) {
            return p.test(el.price1,el.price2);
        }
    };
Run Code Online (Sandbox Code Playgroud)

因此,为了过滤流,我们为来自流的每个元素创建一个新谓词,而不是使用此Predicate作为参数来使用它的测试方法.这样做的最大好处是,我们不必提前创建大量的Predicates,但是我们可以传递lambda函数中的每个元素并获得它的属性.


eri*_*cbn 1

您可以在哪里使用StreamEx 库实施您的解决方案:

StreamEx.ofPairs(prices, (p1, p2) -> p1 + p2 == 5 ? StreamEx.of(p1, p2) : StreamEx.empty())
            .flatMap(Function.identity())
            .forEach(price -> System.out.println(price));
Run Code Online (Sandbox Code Playgroud)

您可能还想创建自己的类来封装这些对。