是否可以使用Java Streams将一个集合映射到另一个集合,但第二个集合必须具有与第一个集合不同的元素数量?
我有地图
"1" -> 10, "2-3" -> 20
并希望将其转换为
List<Node> = Node(1,10), Node(2,20), Node(3,20)
如何使用流程执行此操作?
我的代码是:
import com.google.common.collect.ImmutableMap;
import java.util.*;
import static java.util.stream.Collectors.toList;
public class MapOneToManyQuestion {
public static void main(String[] args) {
new MapOneToManyQuestion().run();
}
void run() {
final Map<String, Integer> map = ImmutableMap.of("1", 10, "2-3", 20);
List<Node> nodes = map.entrySet().stream().map(entry -> {
if (Objects.equals(entry.getKey(), "1")) {
return new Node(1, entry.getValue());
} else {
//return new Node(2, entry.getValue());
//return new Node(3, entry.getValue());
}
}).collect(toList());
}
class Node {
private Integer key;
private Integer value;
public Node(Integer key, Integer value) {
this.key = key;
this.value = value;
}
public Integer key() {
return this.key;
}
public Integer value() {
return this.value;
}
}
}
答案 0 :(得分:3)
您可以使用flatMap
来实现此目标
List<Node> nodes = map.entrySet()
.stream()
.flatMap(entry -> {
String key = entry.getKey();
Integer value = entry.getValue();
return Arrays.stream(key.split("-"))
.map(splitKey -> new Node(Integer.valueOf(splitKey), value));
})
.collect(Collectors.toList());
它流过每个地图元素,并按-
分割密钥,并为每个关键部分创建一个Node
对象,该对象来自该条目的拆分和地图值,最后收集到一个清单。