【问题标题】:Java 8 get a list out of map based on conditionJava 8 根据条件从地图中获取列表
【发布时间】:2018-10-18 21:21:50
【问题描述】:

我有一个Item 课程:

public class Item {
    String name;
    double price;
    // Getters & Setters
}

现在我有一个Map<String, List<Item>> map; 的地图,该地图包含项目的名称和具有相同名称的相应项目列表。

现在我想找出所有符合过滤条件的项目列表。

这是我的过滤器List<String> filter 基本上它包含我需要从地图中过滤的所有名称列表,并将所有选定的项目作为最终列表。

List<Item> output = new ArrayList<>();
        filter.forEach(item -> {
            List<Item> list = map.get(item);
            if (list != null) {
                output .addAll(list);
            }
        });

这里我使用的是 Lambda 表达式,现在有没有办法使用 lamda 或方法引用进一步简化这段代码?

【问题讨论】:

  • List&lt;Item&gt; output = filter.stream().map(map::get).filter(Objects::nonNull).flatMap(List::stream).collect(Collectors.toList())
  • shmosel,非常感谢,完美的答案。你能给我推荐一本很好的教程或书来解释如何使用这些功能吗?
  • 我读过一本名为 Java 8 in Action 的书。但是网上有很多教程。

标签: java list lambda java-8 java-stream


【解决方案1】:

我会流式传输过滤器列表,将其平面映射到列表中的值,然后将它们收集为单线器:

List<Item> result = 
    filter.stream()
          .flatMap(f -> map.getOrDefault(f, Collections.emptyList).stream())
          .collect(Collectors.toList());

【讨论】:

    猜你喜欢
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 2013-01-07
    相关资源
    最近更新 更多