将字符串列表转换为已排序的Map字符串长度作为键

时间:2017-08-26 22:02:45

标签: lambda java-8 java-stream

我有一个List<String>,我必须将其转换为Map,将相同长度的String分组为List,使用String长度作为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); } 键入,排序顺序。可以使用 -

完成
    $.post '/articles/' + id + '/comments',
  contentType: 'application/json'
  data: comment_params:
    commenter: commenter
    body: body
  success: (data, textStatus, jQxhr) ->
    console.log(textStatus)
    $('#comments').append JSON.stringify(data)
  dataType: 'json'

我们如何使用Java 8流做到这一点?

3 个答案:

答案 0 :(得分:8)

可以使用分组收集器将Java流分组到地图中,最简单的方法是使用

Collectors.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);
  }
}

输出:

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

答案 1 :(得分:3)

你可以用流来做:

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

它通过接受3个参数的Collectors.groupingBy的重载来收集流:关键映射器函数,映射的提供者和下游收集器。

然而,有一种更简洁的方法,没有流:

Map<Integer, List<String>> result = new TreeMap<>();
list.forEach(s -> result.computeIfAbsent(s.length(), k -> new ArrayList<>()).add(s));

这使用List.forEachMap.computeIfAbsent来实现您的目标。

答案 2 :(得分:2)

您可以在Java 8中使用groupingBy在一行中执行此操作。

result = list.stream().collect(Collectors.groupingBy(String::length));
相关问题