Java 8 流分组通过使用比较器

标签 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(整理器)。

最佳答案

也许这样:

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]]

关于Java 8 流分组通过使用比较器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45978755/

相关文章:

java - Java Web Start 是否提供默认程序文件夹?

java - @XmlIDREF 编码到 XML 时看不到层次结构

java - 使用多核的前缀搜索算法

java - 了解从 HashSet 生成的流中元素的顺序

java - lambda 表达式和实例化方法引用之间的不同行为

java - Vaadin 当前显示的对象序列化时出现 NotSerializedException

java - 错误 :Execution failed for task ':app:transformClassesAndResourcesWithProguardForRelease

Java流: one liner to perform multiple numeric operations on Int stream

java - 具有两个流的 Lambda

Java8 - 处理 Stream<Callable<...>> 并行交付给非线程安全消费者的惯用方式?