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
smallerThan是Function接受单个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中传播(但是),在其他功能语言中,它被大量使用.
该函数smallerThan接受一个数字并返回一个Predicate对象,在这种情况下,我们将该谓词应用于流的每个元素.
因此,l.get(0)将检索列表中的第一个值l是(5),然后我们把它传递给smallerThan函数和函数返回一个谓词的标准y -> y < x;行文"给出一个数字,返回true,如果它是小于5" ,因此输出[4, 1]
| 归档时间: |
|
| 查看次数: |
1188 次 |
| 最近记录: |