从列表创建映射,其中键是内部和外部对象的一部分

时间:2017-10-04 09:41:27

标签: java java-8 java-stream

是否可以(以简单的方式)将其更改为java8 Stream? (如果你想告诉我两个for更好而不是所有循环都应该改为流,请不要发表评论/回答,这不是重点)

final Map<String, String> map = new HashMap<>();

for(final Person person: list) {
    for(final Internal internal: person.getInternals()) {
        final String key = person.getName() + internal.getKey();
        map.put(key, internal.getValue());
    }
}

主要问题是我无法使用flatMap,因为我将丢失以前的信息。 每个创建的key都是唯一的。

2 个答案:

答案 0 :(得分:5)

那么你可以通过Pair传递它们(虽然我没有编译过,但这个想法应该存在)

 list.stream()
    .flatMap(person -> person.getInternals()
                       .stream()
                       .map(internal -> 
                           Pair.of(person.getName() + internal.getKey(), internal.getValue()))
    .collect(Collectors.toMap(Pair::getLeft, Pair::getRight));

答案 1 :(得分:2)

您可以直接使用collect,如果您确定每个创建的密钥都是唯一的,如上所述,累加器和组合器很容易编写:

Map<String, String> map =
    list.stream().collect(HashMap::new,
                          (m, p) -> p.getInternals().forEach(i -> m.put(p.getName() + i.getKey(), i.getValue())),
                          Map::putAll);