Java 8流使用Comparator进行分组

时间:2017-08-31 10:06:59

标签: java java-stream

我有兴趣将以下代码变成更简洁的代码:

    final String[] strings = {"a", "B", "A", "á", "Á"};
    final Collator collator = Collator.getInstance(Locale.FRANCE);
    collator.setStrength(Collator.PRIMARY);

    final Map<String, Set<String>> m = new TreeMap<>(collator);
    for (String s : strings) {
        m.compute(s, (k, v) -> {
            if (v == null)
                v = new TreeSet<String>();
            v.add(s);
            return v;
        });
    }

    final Collection<Set<String>> requiredResult = m.values();

    requiredResult.forEach(System.out::println);

输出:

[A, a, Á, á]
[B]

基本上这样做是通过忽略大小写和变音符号并将这些“相等”字母组合在一起来将字母视为相等。 (顺便说一下,我知道大多数语言都不会认为字母相等,如果因变音符号不同而有所不同;这只是一个人为的例子。)

我想通过使用流来缩短它。但是,groupingBy收集器需要按字母分组。我这里没有特定的信,只有一个Comparator(整理者)。

1 个答案:

答案 0 :(得分:4)

也许这样:

final String[] strings = {"a", "B", "A", "á", "Á"};
final Collator collator = Collator.getInstance(Locale.FRANCE);
collator.setStrength(Collator.PRIMARY);

Collection<Set<String>> result = Arrays.stream(strings)
            .collect(Collectors.groupingBy(collator::getCollationKey, Collectors.toSet()))
            .values();
System.out.println(result); //[[a, A, á, Á], [B]]