如何使用 java 8 Stream API 将特定对象移动到列表的开头?
How to move specific objects to the beginning of a list using java 8 Stream API?
考虑这个字符串列表
List<String> list = Arrays.asList("c", "k", "f", "e", "k", "d");
我想做的是将所有 k
个字符串移动到 list
的开头,并保持其余顺序相同。
到目前为止我已经尝试过的方法(它有效但我认为它太丑了)
list = Stream.concat(list.stream().filter(s -> s.equals("k")),
list.stream().filter(s -> !s.equals("k"))).collect(
Collectors.toCollection(ArrayList::new));
list.stream().forEach(System.out::print);
输出:
kkcfed
我在问是否还有其他我不知道的 Stream 功能可以帮助我更有效地解决问题。
您可以使用自定义比较器:
list.stream()
.sorted((s1, s2) -> "k".equals(s1) ? -1 : "k".equals(s2) ? 1 : 0)
.forEach(System.out::print);
为了更好的可读性,您还可以使用单独的方法提取它:
public static void main(String[] args) {
List<String> list = Arrays.asList("c", "k", "f", "e", "k", "d");
list.stream()
.sorted(kFirst())
.forEach(System.out::print);
}
private static Comparator<? super String> kFirst() {
return (s1, s2) -> "k".equals(s1) ? -1 : "k".equals(s2) ? 1 : 0;
}
考虑这个字符串列表
List<String> list = Arrays.asList("c", "k", "f", "e", "k", "d");
我想做的是将所有 k
个字符串移动到 list
的开头,并保持其余顺序相同。
到目前为止我已经尝试过的方法(它有效但我认为它太丑了)
list = Stream.concat(list.stream().filter(s -> s.equals("k")),
list.stream().filter(s -> !s.equals("k"))).collect(
Collectors.toCollection(ArrayList::new));
list.stream().forEach(System.out::print);
输出:
kkcfed
我在问是否还有其他我不知道的 Stream 功能可以帮助我更有效地解决问题。
您可以使用自定义比较器:
list.stream()
.sorted((s1, s2) -> "k".equals(s1) ? -1 : "k".equals(s2) ? 1 : 0)
.forEach(System.out::print);
为了更好的可读性,您还可以使用单独的方法提取它:
public static void main(String[] args) {
List<String> list = Arrays.asList("c", "k", "f", "e", "k", "d");
list.stream()
.sorted(kFirst())
.forEach(System.out::print);
}
private static Comparator<? super String> kFirst() {
return (s1, s2) -> "k".equals(s1) ? -1 : "k".equals(s2) ? 1 : 0;
}