Lambda 将字符串列表转换为按键排序的映射字符串长度

Lambda 将字符串列表转换为按键排序的映射字符串长度,lambda,java-8,java-stream,Lambda,Java 8,Java Stream,我有一个列表,我必须将它转换为映射,方法是将相同长度的字符串分组到列表,使用字符串长度作为键,按排序顺序排列。可通过以下方式完成: Map<Integer, List<String>> result = new TreeMap<>(); for (String str : list) { if (!result.containsKey(str.length())) { result.put(str.length(), new Array

我有一个
列表
,我必须将它转换为
映射
,方法是将相同长度的
字符串
分组到
列表
,使用
字符串
长度作为键,按排序顺序排列。可通过以下方式完成:

Map<Integer, List<String>> result = new TreeMap<>();
for (String str : list) {
    if (!result.containsKey(str.length())) {
        result.put(str.length(), new ArrayList<>());
    }
    result.get(str.length()).add(str);
}
Map result=newtreemap();
for(字符串str:list){
如果(!result.containsKey(str.length())){
result.put(str.length(),new ArrayList());
}
result.get(str.length()).add(str);
}

我们如何使用Java 8 streams进行此操作?

您可以使用streams进行此操作:

Map<Integer, List<String>> result = list.stream()
    .collect(Collectors.groupingBy(
        String::length,        // use length of string as key
        TreeMap::new,          // create a TreeMap
        Collectors.toList())); // the values is a list of strings

这使用和来实现您想要的功能。

可以使用分组收集器将Java流分组到一个映射中,最简单的方法是使用

collector.groupBy(比较器)

其中比较器将流值转换为映射键

返回值是从comparator键到条目列表的映射

public class Test {
  public static void main(final String... args) {
    List<String> in = Arrays.asList("A", "AB", "B", "ABC");
    final Map<Integer, List<String>> all = in.stream()
        .collect(Collectors.groupingBy(String::length));
    System.out.println(all);
  }
}
公共类测试{
公共静态void main(最终字符串…参数){
列表in=array.asList(“A”、“AB”、“B”、“ABC”);
final Map all=in.stream()
.collect(收集器.groupingBy(字符串::长度));
系统输出打印项次(全部);
}
}
输出:


{1=[A,B],2=[AB],3=[ABC]}

您可以在Java8中通过一行上的groupingBy实现这一点

result = list.stream().collect(Collectors.groupingBy(String::length));

你试过什么?你遇到了什么问题?在发布之前,您是否尝试查找您的问题?我在IDE中将JDK 9设置为默认值,我已将
List.of
更改为
Arrays.asList
,以使我的答案与Java 8兼容
result = list.stream().collect(Collectors.groupingBy(String::length));