筛选 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);