用Java8进行循环优化

Sth*_*ita 0 foreach for-loop java-8

如何用一条线实现这一目标?

我目前正在尝试这样做

示例:

{{"id" :"2", values: ["10","11", "12"]} , {"id" : "3", values : ["23"]}}
Run Code Online (Sandbox Code Playgroud)

{{"id" :"2","value": "10"},{"id": "2","value":"11"},
 {"id" :"3","value":"23"} , {"id" : "2", "value":"12"}}
Run Code Online (Sandbox Code Playgroud)

我的java代码是

Map<Integer, List<Integer>> attrMap = new HashMap<>();
//getAllData() & item.getValues() both returns List

getAllData().forEach(item - > {
    item.getValues().forEach(val - > {
        attrMap.computeIfAbsent(item.getId(), (k) - > 
        new ArrayList < > ()).add(val.getValue());
    });
});
Run Code Online (Sandbox Code Playgroud)

我怎么能只做一行?

Hol*_*ger 5

由于ID是唯一的,您可以这样做

Map<Integer, List<Integer>> attrMap = getAllData().stream()
  .collect(Collectors.toMap(
    item -> item.getId(),
    item -> item.getValues().stream().map(i->i.getValue()).collect(Collectors.toList())));
Run Code Online (Sandbox Code Playgroud)

但是,当然,这仍然具有两个嵌套循环的性能特征.但它会支持并行处理,但我怀疑你的数据是否足够大以从并行处理中获益.

此外,请注意,生成的地图仍然在结构上与您的第一个模式匹配,

{{"id" :"2", values: ["10","11", "12"]} , {"id" : "3", values : ["23"]}}
Run Code Online (Sandbox Code Playgroud)

你刚刚转换item为结果的一个条目Mapval一个元素List<Integer>.