Java Stream:如何遍历列表并收集数据到列表

时间:2020-05-10 18:12:29

标签: java java-stream

我有一张地图

HashMap<String, List<SomeObject>> map = data();

我需要遍历对象列表并将其映射到另一个对象,然后收集到另一个对象列表。下面是示例代码,我该如何以正确的方式做到这一点?

 List<User> userList = new ArrayList<>();
 map.forEach((key, value) ->
    userList = value.stream()
                .filter(obj-> testSomeCondition(obj))
                .map(obj -> mapper.mapToUser(obj,key))
                .collect(Collectors.toList())
 );

2 个答案:

答案 0 :(得分:2)

您可以使用以下方法实现

List<User> userList = map.entrySet()
  .stream()
  .flatMap(entry -> entry.getValue().stream()
      .filter(object -> testSomeCondition(object))
      .map(object -> mapper.mapToUser(object, entry.getKey()))
  ).collect(Collectors.toList());

flatmap在这里返回一个流,该流基本上具有映射流的所有元素(由mapper函数生成,在这种情况下为entry.getValue().stream()) 您可以了解有关here

的更多信息

答案 1 :(得分:1)

如果不关心性能(由于顺序forEachOrdered引起的),并且可以使用副作用函数(在可变集合上添加),则可以这样做。 (IMO比嵌套流更具可读性)

 List<User> result = new ArrayList<>();
 map.forEach((key, value) -> {
           value
          .stream()
          .filter(this::testSomeCondition)
          .map(object -> mapper.mapToUser(object, key))
          .forEachOrdered(result::add);
       });
 public boolean testSomeCondition(Object object) {return true;}