Java 8 Stream 在列表中查找元素

标签 java lambda java-8 java-stream

我有以下类(class):

public class Item {
    int id;
    String name;
    // few other fields, contructor, getters and setters
}

我有一个项目列表。我想遍历列表并找到具有特定 ID 的实例。我正在尝试通过流来做到这一点。

public void foobar() {

    List<Item> items = getItemList();
    List<Integer> ids = getIdsToLookup();
    int id, i = ids.size() - 1;

    while (i >= 0) {
        id = ids.get(i);
        Optional<Item> item = items
            .stream()
            .filter(a -> a.getId() == id)
            .findFirst();
        // do stuff
        i--;
    }
}

这是遍历列表并获取我需要的元素的最佳方式吗?此外,我在 id 的过滤器行上收到一条错误消息,指出 lambda 表达式中使用的变量必须是最终变量或实际上是最终变量。也许我可以在 while 循环中定义 id,这样应该可以消除异常。谢谢。

最佳答案

你可以尝试使用这样的东西:

ids.forEach(id -> 
    list.stream()
    .filter(p -> p.getId() == id)
    .findFirst()
    .ifPresent(p -> {
        // do stuff here
    });
);

Optional 这里表明你的过滤器方法可以返回一个空流,所以如果你调用 findFirst 它可以找到一个或零个元素。

关于Java 8 Stream 在列表中查找元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35928747/

相关文章:

java - 使用 java 8 @Repeatable 自定义验证注释无法正常工作

java - 在 Java 8 中获取枚举值作为字符串列表

java - CompletableFuture 阻塞主线程

java - 如何使用源码包中的文件(路径是什么?)

java - Dagger 无法提供我的依赖项

java - ANTLR ErrorListener 获取错误消息

java - Spring:从 Web 应用程序线程子线程(来自 ThreadPool)访问请求( session )作用域 Bean

java - Java常量的本地缓存

c# - 为什么反射会为 lambda 返回如此奇怪的名称?

lambda - 基于原始 bool 值的 Java 8 Lambda