簡體   English   中英

Java 8流分組通過使用比較器

[英]Java 8 streams groupingBy using a Comparator

我有興趣將以下代碼轉換為更簡潔的代碼:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM