过滤Java 8列表

时间:2017-02-04 11:31:00

标签: java functional-programming java-8 functional-java

我使用fj.data.List提供的List类型在函数java中有一个List类型列表

import fj.data.List

List<Long> managedCustomers

我正在尝试使用以下内容过滤它:

managedCustomers.filter(customerId -> customerId == 5424164219L)

我收到此消息

enter image description here

根据文档,List有一个过滤方法,这应该有效 http://www.functionaljava.org/examples-java8.html

我错过了什么?

由于

3 个答案:

答案 0 :(得分:4)

你做了什么似乎有点奇怪,Streams(使用filter)常用这样(我不知道你真的想用滤液列表做什么,你可以告诉我在评论tp得到一个更精确的答案):

//Select and print
managedCustomers.stream().filter(customerId -> customerId == 5424164219L)
                         .forEach(System.out::println);

//Select and keep
ArrayList<> newList = managedCustomers.stream().filter(customerId -> customerId == 5424164219L)
                         .collect(Collectors.toList());

答案 1 :(得分:4)

正如@Alexis C的评论中已经指出的那样

managedCustomers.removeIf(customerId -> customerId != 5424164219L);
如果customerId等于5424164219L

应该会为您提供已过滤的列表。

编辑 - 上述代码修改现有managedCustomers删除其他条目。而另一种方法是使用stream().filter()作为 -

managedCustomers.stream().filter(mc -> mc == 5424164219L).forEach(//do some action thee after);

编辑2 -

对于特定的fj.List,您可以使用 -

managedCustomers.toStream().filter(mc -> mc == 5424164219L).forEach(// your action);

答案 2 :(得分:1)

lambda根据上下文确定它的类型。当你有一个不能编译的语句时,javac有时会混淆并抱怨你的lambda将无法编译,而真正的原因是你犯了一些其他的错误,这就是为什么它不能锻炼什么类型你的lambda应该是。

在这种情况下,没有List.filter(x)方法,这是你应该看到的唯一错误,因为除非你修正你的lambda永远不会有意义。

在这种情况下,您可以使用anyMatch,而不是使用过滤器,因为您已经知道只有一个可能的值customerId == 5424164219L

if (managedCustomers.stream().anyMatch(c -> c == 5424164219L) {
    // customerId 5424164219L found
}