我有一个像101-1-5,101-2-4,102-1-5,102-2-5,102-3-5,103-1-4
这样的字符串。
我要将其添加到Map<String, Map<String, String>>
中。
赞:{101={1=5, 2=4}, 102={1=5, 2=5, 3=5}, 103={1=4}}
如何使用Java 8流执行此操作?
我尝试使用普通Java。而且效果很好。
public class Util {
public static void main(String[] args) {
String samp = "101-1-5,101-2-4,102-1-5,102-2-5,102-3-5,103-1-4";
Map<String, Map<String, String>> m1 = new HashMap<>();
Map<String, String> m2 = null;
String[] items = samp.split(",");
for(int i=0; i<items.length; i++) {
String[] subitem = items[i].split("-");
if(!m1.containsKey(subitem[0]) || m2==null) {
m2 = new HashMap<>();
}
m2.put(subitem[1], subitem[2]);
m1.put(subitem[0], m2);
}
System.out.println(m1);
}
}
答案 0 :(得分:6)
您可以为此使用以下代码段:
Map<String, Map<String, String>> result = Arrays.stream(samp.split(","))
.map(i -> i.split("-"))
.collect(Collectors.groupingBy(a -> a[0], Collectors.toMap(a -> a[1], a -> a[2])));
首先,它会创建您的项目流,这些项目将映射到包含子项的数组流。最后,通过在第一个子项目上使用group by收集所有内容,并创建一个内部地图,其中第二个值为键,最后一个为值。
结果是:
{101={1=5, 2=4}, 102={1=5, 2=5, 3=5}, 103={1=4}}
答案 1 :(得分:4)
Map<String, Map<String, String>> map = Arrays.stream(samp.split(","))
.map(s -> s.split("-"))
.collect(Collectors.toMap(
o -> o[0],
o -> Map.of(o[1], o[2]),
(m1, m2) -> Stream.concat(m1.entrySet().stream(), m2.entrySet().stream())
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))));
Map.of
来自Java 9,如果您使用的是Java 8,则可以使用AbstractMap.SimpleEntry
。
塞缪尔(Samuel)的answer更好,更简洁。