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]