繁体   English   中英

如何使用java 8 Stream API将特定对象移动到列表的开头?

[英]How to move specific objects to the beginning of a list using java 8 Stream API?

考虑这个String列表

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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM