我遇到了将一些列表值收集到存储桶的问题。例如,假设我有一个字符串列表:
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 */)
答案 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)