使用 Collator 在一行中收集到 TreeMap
Collect to a TreeMap in one line using Collator
我有如下一段代码。
import java.util.Arrays;
import java.util.Collections;
import java.util.Map;
import java.util.TreeMap;
import java.util.stream.Collectors;
public final class Main {
public static void main(final String[] args) {
final Object[][] pairs = { { "Arka Gdynia", Collections.emptyList() },
{ "Legia Warszawa", Collections.emptyList() }, { "ŁKS Łódź", Collections.emptyList() },
{ "Śląsk Wrocław", Collections.emptyList() }, { "Wisła Kraków", Collections.emptyList() }, };
final Map<String, Object> clubPlayerMap = Arrays.stream(pairs)
.collect(Collectors.toMap(c -> c[0].toString(), c -> c[1], (o1, o2) -> o1, TreeMap::new));
for (final String key : clubPlayerMap.keySet()) {
System.out.println(key);
}
}
}
不幸的是,这并没有产生我想要的结果。键需要按照波兰语排序规则排序。
Arka Gdynia
Legia Warszawa
Wisła Kraków
ŁKS Łódź
Śląsk Wrocław
我期望的结果是
Arka Gdynia
Legia Warszawa
ŁKS Łódź
Śląsk Wrocław
Wisła Kraków
所以我用谷歌搜索并找到了一种使用 java.text.Collator
执行此操作的方法。但是,我想知道是否可以将它与 stream()
和 collect()
.
一起作为单行进行
我想出的解决方案如下,但不幸的是它不是很整洁。
import java.text.Collator;
import java.util.Arrays;
import java.util.Collections;
import java.util.Locale;
import java.util.Map;
import java.util.TreeMap;
import java.util.stream.Collectors;
public final class Main {
public static void main(final String[] args) {
final Object[][] pairs = { { "Arka Gdynia", Collections.emptyList() },
{ "Legia Warszawa", Collections.emptyList() }, { "ŁKS Łódź", Collections.emptyList() },
{ "Śląsk Wrocław", Collections.emptyList() }, { "Wisła Kraków", Collections.emptyList() }, };
final Map<String, Object> clubPlayerMapCollated = new TreeMap<>(Collator.getInstance(new Locale("pl", "PL")));
final Map<String, Object> clubPlayerMap = Arrays.stream(pairs)
.collect(Collectors.toMap(c -> c[0].toString(), c -> c[1], (o1, o2) -> o1, TreeMap::new));
clubPlayerMapCollated.putAll(clubPlayerMap);
for (final String key : clubPlayerMapCollated.keySet()) {
System.out.println(key);
}
}
}
是否有可能从一张纸上制作地图?
不是将方法引用传递给默认构造函数 (TreeMap::new
),而是传递将生成所需 TreeMap
:
的 lambda 表达式
final Map<String, Object> clubPlayerMap =
Arrays.stream(pairs)
.collect(Collectors.toMap(c -> c[0].toString(),
c -> c[1],
(o1, o2) -> o1,
() -> new TreeMap<>(Collator.getInstance(new Locale("pl", "PL")))));
我有如下一段代码。
import java.util.Arrays;
import java.util.Collections;
import java.util.Map;
import java.util.TreeMap;
import java.util.stream.Collectors;
public final class Main {
public static void main(final String[] args) {
final Object[][] pairs = { { "Arka Gdynia", Collections.emptyList() },
{ "Legia Warszawa", Collections.emptyList() }, { "ŁKS Łódź", Collections.emptyList() },
{ "Śląsk Wrocław", Collections.emptyList() }, { "Wisła Kraków", Collections.emptyList() }, };
final Map<String, Object> clubPlayerMap = Arrays.stream(pairs)
.collect(Collectors.toMap(c -> c[0].toString(), c -> c[1], (o1, o2) -> o1, TreeMap::new));
for (final String key : clubPlayerMap.keySet()) {
System.out.println(key);
}
}
}
不幸的是,这并没有产生我想要的结果。键需要按照波兰语排序规则排序。
Arka Gdynia
Legia Warszawa
Wisła Kraków
ŁKS Łódź
Śląsk Wrocław
我期望的结果是
Arka Gdynia
Legia Warszawa
ŁKS Łódź
Śląsk Wrocław
Wisła Kraków
所以我用谷歌搜索并找到了一种使用 java.text.Collator
执行此操作的方法。但是,我想知道是否可以将它与 stream()
和 collect()
.
我想出的解决方案如下,但不幸的是它不是很整洁。
import java.text.Collator;
import java.util.Arrays;
import java.util.Collections;
import java.util.Locale;
import java.util.Map;
import java.util.TreeMap;
import java.util.stream.Collectors;
public final class Main {
public static void main(final String[] args) {
final Object[][] pairs = { { "Arka Gdynia", Collections.emptyList() },
{ "Legia Warszawa", Collections.emptyList() }, { "ŁKS Łódź", Collections.emptyList() },
{ "Śląsk Wrocław", Collections.emptyList() }, { "Wisła Kraków", Collections.emptyList() }, };
final Map<String, Object> clubPlayerMapCollated = new TreeMap<>(Collator.getInstance(new Locale("pl", "PL")));
final Map<String, Object> clubPlayerMap = Arrays.stream(pairs)
.collect(Collectors.toMap(c -> c[0].toString(), c -> c[1], (o1, o2) -> o1, TreeMap::new));
clubPlayerMapCollated.putAll(clubPlayerMap);
for (final String key : clubPlayerMapCollated.keySet()) {
System.out.println(key);
}
}
}
是否有可能从一张纸上制作地图?
不是将方法引用传递给默认构造函数 (TreeMap::new
),而是传递将生成所需 TreeMap
:
final Map<String, Object> clubPlayerMap =
Arrays.stream(pairs)
.collect(Collectors.toMap(c -> c[0].toString(),
c -> c[1],
(o1, o2) -> o1,
() -> new TreeMap<>(Collator.getInstance(new Locale("pl", "PL")))));