Java流将对象列表收集到存储桶

Ily*_*lya 3 java java-8 java-stream

我有一个问题是收集一些列表值到桶.例如,假设我有一个字符串列表:

List<String> strs = Arrays.asList("ABC", "abc", "bca", "BCa", "AbC");
Run Code Online (Sandbox Code Playgroud)

我想把字符串放入集合(或列表)集合中,它们只包含不同的字符串,例如上面它将是两个集合的集合: [["ABC", "abc", "AbC"], ["bca", "BCa"]]

所以请帮我写这个问题的收藏家.

List<Set<String>> result = strs.stream()
                .collect(/* some collectors magic here */)
Run Code Online (Sandbox Code Playgroud)

Ale*_* C. 11

您正在寻找的"一些收藏家魔术"可以分两步完成:

  • 首先,您需要按要查找的属性对元素进行分组.在这种情况下,因为你想忽略大小写,String#toLowerCase所以完成这项工作(不要忘记带有Localeas参数的重载方法).您还希望分组的值是唯一的,以便您可以使用重载版本groupingBy将它们放入Set(默认实现使用a List)
  • 由于您对密钥不感兴趣,只需从结果映射中获取值并使用collectingAndThen收集器将它们放入列表中(如果您确实需要列表).

import static java.util.stream.Collectors.collectingAndThen;
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.toSet;

...

List<Set<String>> result = 
    strs.stream()
        .collect(collectingAndThen(groupingBy(String::toLowerCase, toSet()), 
                                   m -> new ArrayList<>(m.values())));
Run Code Online (Sandbox Code Playgroud)

  • 在我看来,这更清洁了. (2认同)