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函数中的每个元素并获得它的属性.
您可以在哪里使用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)
您可能还想创建自己的类来封装这些对。
| 归档时间: |
|
| 查看次数: |
7743 次 |
| 最近记录: |