如何通过 Java 8 中的值过滤地图?

新手上路,请多包涵

我有一个映射,其中值是字符串,键是列表:

 Map<String, List<BoMLine>> materials

我想按值过滤这张地图;是这样的:

 materials.entrySet().stream()
       .filter(a -> a.getValue().stream()
           .filter(l -> MaterialDao.findMaterialByName(l.getMaterial()).ispresent)

但这对我不起作用。有人有想法吗?

原文由 Nazila 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 378
2 个回答

如果我正确理解你的过滤条件,你想检查过滤的 Stream 你从值 List 产生的任何元素,如果有,传递相应的 Map 进入输出 Map

 Map<String, List<BoMLine>>
    filtered = materials.entrySet()
                        .stream()
                        .filter(a->a.getValue()
                                    .stream()
                                    .anyMatch(l->MaterialDao.findMaterialByName(l.getMaterial())))
                        .collect(Collectors.toMap(e->e.getKey(),e->e.getValue()));

这是假设 MaterialDao.findMaterialByName(l.getMaterial()) 返回 boolean

原文由 Eran 发布,翻译遵循 CC BY-SA 3.0 许可协议

通常,这是按值过滤地图的方法:

 static <K, V> Map<K, V> filterByValue(Map<K, V> map, Predicate<V> predicate) {
    return map.entrySet()
            .stream()
            .filter(entry -> predicate.test(entry.getValue()))
            .collect(Collectors.toMap(Entry::getKey, Entry::getValue));
}

像这样称呼它:

 Map<String, Integer> originalMap = new HashMap<>();
originalMap.put("One", 1);
originalMap.put("Two", 2);
originalMap.put("Three", 3);

Map<String, Integer> filteredMap = filterByValue(originalMap, value -> value == 2);

Map<String, Integer> expectedMap = new HashMap<>();
expectedMap.put("Two", 2);

assertEquals(expectedMap, filteredMap);

原文由 Matthias Braun 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题