Java中的Streams无法想出这段代码

我找到了以下代码片段:

Function<Integer, Predicate> smallerThan = x -> y -> y < x; List l = Arrays.asList(5, 6, 7, 23, 4, 5645, 6, 1223, 44453, 60182, 2836, 23993, 1); List list2 = l.stream() .filter(smallerThan.apply(l.get(0))) .collect(Collectors.toList()); System.out.println(list2); 

作为输出我收到:

 [4, 1] 

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

smallerThan是一个接受单个Integer并返回Predicate的函数( Predicate是一个接受单个Integer并返回boolean的函数)。

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

 y -> y < l.get(0) 

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

当您将Predicate传递给filter ,您的Stream管道仅保留小于l.get(0)的元素。

您的管道可以重写为:

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

由于l.get(0)5 ,因此管道将返回原始列表中小于5所有元素。

这被称为“currying”,例如在Java 8之前也可以通过匿名类来实现,但它更加冗长。 最终,它是一个返回Function ,虽然不是在Java中传播,但在其他函数式语言中,它被大量使用。

函数smallerThan接受一个数字并返回一个Predicate对象,在这种情况下,我们将这个谓词应用于流的每个元素。

因此, l.get(0)将检索列表l的第一个值,即(5) ,然后我们将它传递给smallerThan函数,此函数返回一个谓词为y -> y < x;的谓词y -> y < x; 读取为“给定一个数字,如果小于5则返回true”,因此输出为[4, 1]