【问题标题】:Update an exisiting Map Object when using Java 8 streams使用 Java 8 流时更新现有 Map 对象
【发布时间】:2017-03-09 11:48:33
【问题描述】:

在这里,我将两个不同的列表转换为一个地图。在我使用正常的 for 循环来执行此操作之前。由于性能问题,现在我正在使用流。使用流时如何为两个对象列表使用相同的 mapObject。

final Set<Object1> objects1 = new HashSet<Object1>();
final Set<Object2> objects2 = new HashSet<Object2>();
final Map<Id, Object> objectMap = new HashMap<Id, Object>();


private void addObjectsToMap(Map<Id, Object> objectMap, final Collection<? extends Object> objects)
{
    // used this operation earlier to convert
    for (final Object object : objects)
    {
        objectMap.put(object.getId(), object);
    }

    // using this one now
    objectMap = objects.parallelStream().collect(
                    Collectors.toMap(object -> object.getId(), object -> object));
} 

addObjectsToMap(objectMap, objects1);
addObjectsToMap(objectMap, objects2);

【问题讨论】:

  • 您在正常循环时遇到了性能问题?你有多少个对象?
  • 从千到百万不等
  • 在您的方法中接受可变参数并使用 flatMap 将两个集合转换为一个流应该可以工作
  • 您现在所拥有的是您正在创建完全不同的地图,您不会收集到您在方法内部传递的地图。此外,使用并行流不会提高性能 - 您只会在更多工作人员之间分散负载并引入并行化开销。
  • 是否有一些魔法使Object 拥有getId() 方法?

标签: java java-8 hashmap java-stream


【解决方案1】:

您可以使用 Stream 的 concat 将 2 个流连接成单个流

Map<Integer, Object> objectMap;
objectMap = Stream.concat(objects1.stream(), objects2.stream())
                  .parallel()
                  .collect(Collectors.toMap(Object::getId, Function.identity()));

【讨论】:

  • Stream.of(objects1, objects2).flatMap(List::stream)
猜你喜欢
  • 1970-01-01
  • 2015-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-24
  • 2022-06-18
  • 1970-01-01
  • 2021-02-17
相关资源
最近更新 更多