Java中的流,无法弄清楚此代码

2022-09-03 09:14:08

我找到了以下代码片段:

Function<Integer, Predicate<Integer>> smallerThan = x -> y -> y < x;
List<Integer> l = Arrays.asList(5, 6, 7, 23, 4, 5645,
    6, 1223, 44453, 60182, 2836, 23993, 1);

List<Integer> list2 = l.stream()
    .filter(smallerThan.apply(l.get(0)))
    .collect(Collectors.toList());

System.out.println(list2);

作为输出,我收到:

[4, 1]

考虑到我们只传递一个参数,此示例中的函数如何工作?smallerThansmallerThan.apply(l.get(0))


答案 1

smallerThan是接受单个并返回 a 的 (a 是接受单个并返回 a 的函数)。FunctionIntegerPredicate<Integer>Predicate<Integer>Integerboolean

smallerThan.apply(l.get(0))返回一个如下所示的:Predicate<Integer>

y -> y < l.get(0)

即,如果传递给它的输入小于 ,则返回。truel.get(0)

当您将其传递给 时,您的管道仅保留小于 的元素。PredicatefilterStreaml.get(0)

您的管道可以重写为:

List<Integer> list2 = l.stream()
    .filter(y -> y < l.get(0))
    .collect(Collectors.toList());

由于 是 ,您的管道将返回原始列表中小于 的所有元素。l.get(0)55


答案 2

这被称为“咖喱”,例如在Java 8之前也可以通过匿名类,但它要详细得多。最终,它是返回a的,虽然在Java中还没有传播(尚未),但在其他函数式语言中,它被大量使用。FunctionFunction


推荐