2017-10-04 41 views
3

是否有可能(以简单的方式)将其更改为java8Stream? (请不要评论/如果你想告诉我有两个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

你并不需要第二个循环可言,因为它是一样的:每个人,把它的名字和最后一个内部价值地图。你可以在收集器 – mlecz

回答

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)); 
+0

中做到这一点是的,我知道,使用另一个对象是一个答案,但在这个解决方案中,我们需要第二个内部流。我希望有一个链条的答案 – ByeBye

+0

@ByeBye你会如何摆脱第二次迭代?我现在不明白你的意思 – Eugene

+1

@ByeBye这个*是*“一个链” – Holger

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);