首页 > 解决方案 > 将对象数组转换为 LinkedHashMap

问题描述

我想使用 Java Stream API 创建一个 LinkedHashMap。

Map<String, String> builtProps = Maps.newLinkedHashMap();
    Couple[] callLegData = getCallLegData();
    for (Couple cl : callLegData) {
        String key = cl.key;
        String value = cl.value;
        // building properties
        String buildProperty = deviceInfo.buildProperty(key);

        // call device info
        if (buildProperty != null) {
            builtProps.put(buildProperty, value);
        }
    }

我尝试过这样的事情

        Stream.of(callLegData)
        .map(k -> deviceInfo.buildProperty(k.key))
        .filter(Objects::nonNull)
        .collect(Collectors.toMap(key -> key, value -> value, (x, y) -> y, LinkedHashMap::new));

但未能从 callLegData 即callLegData.value获得价值

标签: javajava-stream

解决方案


我建议首先过滤掉该方法buildProperty返回 null 的对象,然后将其余部分映射到一个简单的条目并收集到映射,就像您在示例中所做的那样:

import java.util.AbstractMap.SimpleEntry;

....

Stream.of(callLegData)
      .filter(cld -> deviceInfo.buildProperty(cld.key) != null)
      .map(cld -> new SimpleEntry<>(deviceInfo.buildProperty(cld.key), cld.value))
      .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (x, y) -> y, LinkedHashMap::new));

编辑

IfbuildProperty是一个繁重的操作,并且您不想调用该方法两次,只需交换映射和过滤操作以过滤具有空键的条目:

Stream.of(callLegData)
      .map(cld -> new SimpleEntry<>(deviceInfo.buildProperty(cld.key), cld.value))
      .filter(entry -> entry.getKey() != null)
      .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (x, y) -> y, LinkedHashMap::new));

推荐阅读