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

时间:2016-01-26 20:10:02

标签: java java-8 java-stream

我遇到了将一些列表值收集到存储桶的问题。例如,假设我有一个字符串列表:

List<String> strs = Arrays.asList("ABC", "abc", "bca", "BCa", "AbC");

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

请帮我写这个问题的收藏家。

List<Set<String>> result = strs.stream()
                .collect(/* some collectors magic here */)

3 个答案:

答案 0 :(得分:10)

&#34;一些收藏家魔术&#34;您正在寻找可以分两步完成:

  • 首先,您需要按要查找的属性对元素进行分组。在这种情况下,由于您要忽略大小写,String#toLowerCase完成了这项工作(不要忘记以Locale为参数的重载方法)。您还希望分组的值是唯一的,以便您可以使用重载版本的groupingBy将它们放入Set(默认实现使用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())));

答案 1 :(得分:2)

尝试:

List<Set<String>> result = 
  strs.stream()
      .collect(groupingBy(String::toLowerCase, toSet())) // Map<String, Set<String>>
      .values()            // Collection<Set<String>>
      .stream()            // Stream<Set<String>> 
      .collect(toList());  // List<Set<String>>

答案 2 :(得分:-1)

以下是AbacusUtil

的代码
git log -n1 --oneline --name-status | grep '^M'

声明:我是AbacusUtil的开发者。