首页 > 解决方案 > Java 8 Streams 查找元素并将其添加到新列表的开头

问题描述

我想知道这是否可以使用 Java Streams 用一行来解决这个问题:我需要在字符串列表中找到一个字符串并创建另一个列表,其中搜索字符串(如果找到)将是新列表中的第一个字符串然后是其余的字符串值

例如:

List<String> oldList = Arrays.asList("Avacado", "Apple", "Orange", "Chocolate");

因此,现在如果使用过滤器“巧克力”进行搜索,它应该返回一个新列表,其中包含按“巧克力”、“Avacado”、“Apple”、“Orange”顺序排列的元素。

List<String> newList =  oldList.stream().filter(i -> i.equals("Chocolate")).collect(Collectors.toList()) ???

标签: javalistjava-8java-stream

解决方案


您要求使用Stream. 这是一:

    List<String> sorted = oldList.stream()
            .sorted(Comparator.comparing("Chocolate"::equals).reversed())
            .collect(Collectors.toList());
    System.out.println(sorted);

它给出了:

[Chocolate, Avacado, Apple, Orange]

所以只"Chocolate"在第一个索引处移动。

但实际上你不需要Stream. 列表本身就足够了:

oldList.sort(Comparator.comparing("Chocolate"::equals).reversed());
System.out.println(oldList);

结果是

[Chocolate, Avacado, Apple, Orange]

... 相同。

编辑:
我已经更新了我的答案,因为@Holger 指出它违反了Comparator.compare(o1,o2). 我正在使用 Holger 在他的评论中建议的解决方案。因此,当我两次努力获得正确的解决方案时,他应该得到支持。

这种方法将每个字符串映射到一个boolean值,该值说明该字符串是否等于"Chocolate"。在相等的情况下,如果另一个字符串不等于,Boolean.compare(x,y)则返回1forx-1for 。如果和等于结果是。 当我们要移动到第一个索引时,它的索引必须减小。因此需要一个反向比较器(=>和=> )。y"Chocolate"xy"Chocolate"0
"Chocolate"1-1-11


推荐阅读