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

mas*_*ter 15 java lambda java-8 java-stream

我找到了以下代码片段:

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);
Run Code Online (Sandbox Code Playgroud)

作为输出我收到:

[4, 1]
Run Code Online (Sandbox Code Playgroud)

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

Era*_*ran 19

smallerThanFunction接受单个Integer并返回a Predicate<Integer>(a Predicate<Integer>是接受单个Integer并返回a 的函数boolean).

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

y -> y < l.get(0)
Run Code Online (Sandbox Code Playgroud)

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

当你传递Predicate给它时filter,你的Stream管道只保留小于的元素l.get(0).

您的管道可以重写为:

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

因为l.get(0)就是5,您的管道返回小于的所有原始列表的元素5.


Eug*_*ene 13

这被称为"currying",例如,在Java 8之前也可以通过匿名类来实现,但它更加冗长.最终,它是一个Function返回Function,而不是在Java中传播(但是),在其他功能语言中,它被大量使用.


Ous*_* D. 8

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

因此,l.get(0)将检索列表中的第一个值l(5),然后我们把它传递给smallerThan函数和函数返回一个谓词的标准y -> y < x;行文"给出一个数字,返回true,如果它是小于5" ,因此输出[4, 1]