Java8 Lambda 比较两个 List 并转换为 Map

Java8 Lambda compare two List and trasform to Map

假设我有两个 class:

class Key {
 private Integer id;
 private String key;
}

class Value {
  private Integer id;
  private Integer key_id;
  private String value;
}

现在我填写第一个列表如下:

List<Key> keys = new ArrayLisy<>();
keys.add(new Key(1, "Name"));
keys.add(new Key(2, "Surname"));
keys.add(new Key(3, "Address"));

第二个:

List<Value> values = new ArrayLisy<>();
values.add(new Value(1, 1, "Mark"));
values.add(new Value(2, 3, "Fifth Avenue"));
values.add(new Value(3, 2, "Fischer"));

你能告诉我如何重写以下代码吗:

for (Key k : keys) {
        for (Value v : values) {
            if (k.getId().equals(v.getKey_Id())) {
                map.put(k.getKey(), v.getValue());
                break;
        }
    }
}

使用 Lambdas?

谢谢!

-------更新------

是的,它确实有效,我忘记了第一个 post 上的“使用 Lambdas”(现在我添加了)。我想用 Lamdas 重写两个嵌套的 for cicle。

下面是使用流的方法。

  • 流式传输密钥列表
  • 流式传输用于索引值列表的索引
  • 筛选匹配 ID
  • 将key实例key和value实例value打包成SimpleEntry
  • 然后将其添加到地图中。
Map<String, String> results = keys.stream()
        .flatMap(k -> IntStream.range(0, values.size())
                .filter(i -> k.getId() == values.get(i).getKey_id())
                .mapToObj(i -> new AbstractMap.SimpleEntry<>(
                        k.getKey(), values.get(i).getValue())))
        .collect(Collectors.toMap(Entry::getKey, Entry::getValue));

results.entrySet().forEach(System.out::println);

打印

Address=Fifth Avenue
Surname=Fischer
Name=Mark

imo,你的方法更清晰,更容易理解。 Streams/w lambda 或方法引用并不总是最好的方法。

也可以考虑混合方法。

  • 分配地图。
  • 迭代键。
  • 流式传输试图在 key_id 和 return 上找到匹配项的值。
  • 已找到该值(isPresent) 添加到地图。
Map<String,String> map = new HashMap<>();

for (Key k : keys) {
    Optional<Value> opt = values.stream()
            .filter(v -> k.getId() == v.getKey_id())
            .findFirst();
    if (opt.isPresent()) {
        map.put(k.getKey(), opt.get().getValue());
    }
}