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

Dod*_*ion 2 java java-stream

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

\n\n
    final String[] strings = {"a", "B", "A", "\xc3\xa1", "\xc3\x81"};\n    final Collator collator = Collator.getInstance(Locale.FRANCE);\n    collator.setStrength(Collator.PRIMARY);\n\n    final Map<String, Set<String>> m = new TreeMap<>(collator);\n    for (String s : strings) {\n        m.compute(s, (k, v) -> {\n            if (v == null)\n                v = new TreeSet<String>();\n            v.add(s);\n            return v;\n        });\n    }\n\n    final Collection<Set<String>> requiredResult = m.values();\n\n    requiredResult.forEach(System.out::println);\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出:

\n\n
[A, a, \xc3\x81, \xc3\xa1]\n[B]\n
Run Code Online (Sandbox Code Playgroud)\n\n

基本上,它的作用是通过忽略大小写和变音标记来将字母视为相等,并将这些“相等”字母分组在一起。(顺便说一句,我知道大多数语言如果变音符号不同,则不认为字母相等;这只是一个人为的示例。)

\n\n

我正在考虑通过使用流来缩短它。然而,groupingBy收集器要求将事物按字母分组。我这里没有具体的字母,只有一个Comparator(整理者)。

\n

Nik*_*lay 5

也许这样:

\n\n
final String[] strings = {"a", "B", "A", "\xc3\xa1", "\xc3\x81"};\nfinal Collator collator = Collator.getInstance(Locale.FRANCE);\ncollator.setStrength(Collator.PRIMARY);\n\nCollection<Set<String>> result = Arrays.stream(strings)\n            .collect(Collectors.groupingBy(collator::getCollationKey, Collectors.toSet()))\n            .values();\nSystem.out.println(result); //[[a, A, \xc3\xa1, \xc3\x81], [B]]\n
Run Code Online (Sandbox Code Playgroud)\n