筛选 Java 8 个列表
Filtering on Java 8 List
我使用 fj.data.List
提供的列表类型在功能 java 中有一个列表类型列表
import fj.data.List
List<Long> managedCustomers
我正在尝试使用以下方法对其进行过滤:
managedCustomers.filter(customerId -> customerId == 5424164219L)
我收到这条消息
根据文档,List 有一个过滤方法,这应该有效
http://www.functionaljava.org/examples-java8.html
我错过了什么?
谢谢
你做的好像有点奇怪,Streams
(要用filter
)一般都是这样用的(不知道你到底想用filtrate list做什么,你可以在评论中告诉我 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());
lambda 通过上下文确定其类型。当你有一个不编译的语句时,javac
有时会感到困惑并抱怨你的 lambda 不会编译,而真正的原因是你犯了一些其他错误,这就是为什么它不能锻炼什么类型你的 lambda 应该是。
在这种情况下,没有 List.filter(x)
方法,这是您应该看到的唯一错误,因为除非您修复您的 lambda 永远不会有意义。
在这种情况下,您可以使用 anyMatch 而不是过滤器,因为您已经知道只有一个可能的值 customerId == 5424164219L
if (managedCustomers.stream().anyMatch(c -> c == 5424164219L) {
// customerId 5424164219L found
}
正如@Alexis C 在评论中指出的那样
managedCustomers.removeIf(customerId -> customerId != 5424164219L);
如果 customerId
等于 5424164219L
., 应该会为您提供筛选列表
Edit - 上面的代码修改了现有的 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);
我使用 fj.data.List
提供的列表类型在功能 java 中有一个列表类型列表import fj.data.List
List<Long> managedCustomers
我正在尝试使用以下方法对其进行过滤:
managedCustomers.filter(customerId -> customerId == 5424164219L)
我收到这条消息
根据文档,List 有一个过滤方法,这应该有效 http://www.functionaljava.org/examples-java8.html
我错过了什么?
谢谢
你做的好像有点奇怪,Streams
(要用filter
)一般都是这样用的(不知道你到底想用filtrate list做什么,你可以在评论中告诉我 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());
lambda 通过上下文确定其类型。当你有一个不编译的语句时,javac
有时会感到困惑并抱怨你的 lambda 不会编译,而真正的原因是你犯了一些其他错误,这就是为什么它不能锻炼什么类型你的 lambda 应该是。
在这种情况下,没有 List.filter(x)
方法,这是您应该看到的唯一错误,因为除非您修复您的 lambda 永远不会有意义。
在这种情况下,您可以使用 anyMatch 而不是过滤器,因为您已经知道只有一个可能的值 customerId == 5424164219L
if (managedCustomers.stream().anyMatch(c -> c == 5424164219L) {
// customerId 5424164219L found
}
正如@Alexis C 在评论中指出的那样
managedCustomers.removeIf(customerId -> customerId != 5424164219L);
如果 customerId
等于 5424164219L
.,应该会为您提供筛选列表
Edit - 上面的代码修改了现有的 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);