Java 从列表创建贴图,其中键位于内部和外部对象的一部分

Java 从列表创建贴图,其中键位于内部和外部对象的一部分,java,java-8,java-stream,Java,Java 8,Java Stream,是否可以(以简单的方式)将其更改为java8Stream?(如果您想告诉我两个for更好,并且不是所有循环都应该更改为流,请不要评论/回答,这不是重点) final Map=new HashMap(); 对于(最终人员:列表){ for(最终内部:person.getInternals()){ 最后一个字符串key=person.getName()+internal.getKey(); map.put(key,internal.getValue()); } } 主要问题是我不能使用flatMa

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

final Map=new HashMap();
对于(最终人员:列表){
for(最终内部:person.getInternals()){
最后一个字符串key=person.getName()+internal.getKey();
map.put(key,internal.getValue());
}
}

主要问题是我不能使用
flatMap
,因为我会丢失以前的信息每个创建的
都是唯一的。

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


您可以直接使用
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);
地图=
list.stream().collect(HashMap::new,
(m,p)->p.getInternals().forEach(i->m.put(p.getName()+i.getKey(),i.getValue()),
地图:putAll);

您根本不需要第二个循环,因为它与:对于每个人,将其名称和最后一个内部值放入地图。我知道,在这里使用另一个对象是一个答案,但在这个解决方案中,我们需要第二个内部流。我希望有一个答案chain@ByeBye您将如何摆脱第二次迭代?我完全不明白你的意思now@ByeBye这是“一条链”,我的意思是像内部的
flatMap
,但是从外部获得额外的字段class@ByeBye这毫无意义。。。对不起,我不明白
 list.stream()
    .flatMap(person -> person.getInternals()
                       .stream()
                       .map(internal -> 
                           Pair.of(person.getName() + internal.getKey(), internal.getValue()))
    .collect(Collectors.toMap(Pair::getLeft, Pair::getRight));
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);