我有一种情况,我必须从列表中生成一个地图
我有一份清单如下
List<String> li = new ArrayList<String>();
li.add("A:abc");
li.add("B:xyz");
li.add("C:mno");
li.add("B:bbb");
li.add("A:aaa");
li.add("C:xxx");我想从这里生成一个地图,如下所示:Map<String, String[]>或Map<String, List<String>>
我编写了下面的lambda表达式
li.stream().map(i->i.split(":")).collect(Collectors.groupingBy(i->i[0]));但是得到的映射是Map<String, List<String[]>>,这不是预期的
发布于 2021-04-10 20:54:47
像这样试试。
列表(list
mapping,以便将第二个元素从数组中放入列表中。List<String> li = new ArrayList<String>();
li.add("A:abc");
li.add("B:xyz");
li.add("C:mno");
li.add("B:bbb");
li.add("A:aaa");
li.add("C:xxx");
Map<String, List<String>> map =
li.stream().map(str -> str.split(":"))
.collect(Collectors.groupingBy(a -> a[0],
Collectors.mapping(a -> a[1],
Collectors.toList())));
map.entrySet().forEach(System.out::println);版画
A=[abc, aaa]
B=[xyz, bbb]
C=[mno, xxx]发布于 2021-04-11 10:03:42
来自@WJS的答案是完美的,但是,如果您想像您在问题中所问的那样获得一个Map<String, String[]>,您可以考虑使用Collectors.collectingAndThen和List#toArray扩展它
Map<String, String[]> result = li.stream()
.map(x -> x.split(":"))
.collect(Collectors.groupingBy(
x -> x[0],
Collectors.mapping(
x -> x[1],
Collectors.collectingAndThen(
Collectors.toList(),
x -> x.toArray(String[]::new)
)
)
));result.forEach((key, value) -> System.out.println(key + " : " + Arrays.toString(value)));打印预期结果
A : [abc, aaa]
B : [xyz, bbb]
C : [mno, xxx]发布于 2021-04-11 11:53:00
我想从这里生成一个地图,如
Map<String, String[]>或Map<String, List<String>>下面所示
您不需要调用.map;只需使用Collectors.groupingBy(s -> s.split(":")[0])收集流即可。
演示:
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<String> li = new ArrayList<String>();
li.add("A:abc");
li.add("B:xyz");
li.add("C:mno");
li.add("B:bbb");
li.add("A:aaa");
li.add("C:xxx");
Map<String, List<String>> map =
li.stream().collect(Collectors.groupingBy(s -> s.split(":")[0]));
map.entrySet().forEach(System.out::println);
}
}输出:
A=[A:abc, A:aaa]
B=[B:xyz, B:bbb]
C=[C:mno, C:xxx]但是,如果您期望得到这样的结果
A=[abc, aaa]
B=[xyz, bbb]
C=[mno, xxx]您可以像正在做的那样调用.map,然后按数组的第一个元素分组,这是分割的结果,根据数组的第二个元素的列表进行映射。
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<String> li = new ArrayList<String>();
li.add("A:abc");
li.add("B:xyz");
li.add("C:mno");
li.add("B:bbb");
li.add("A:aaa");
li.add("C:xxx");
Map<String, List<String>> map =
li.stream()
.map(s -> s.split(":"))
.collect(
Collectors.groupingBy(
arr -> arr[0], Collectors.mapping(
arr -> arr[1], Collectors.toList()
)
)
);
map.entrySet().forEach(System.out::println);
}
}https://stackoverflow.com/questions/67038945
复制相似问题