我想知道是否可以使用Java Streams一行来解决这个问题:我需要在字符串列表中找到一个字符串并创建另一个列表,其中搜索字符串(如果找到)将是新列表中的第一个字符串然后是其余的String值
对于Eg:
List oldList = Arrays.asList("Avacado", "Apple", "Orange", "Chocolate");
所以现在如果使用过滤器“巧克力”进行搜索,它应该返回一个新列表,其中包含“巧克力”,“Avacado”的元素,
“Apple”,“Orange”.
List newList = oldList.stream().filter(i -> i.equals("Chocolate")).collect(Collectors.toList()) ???
解决方法:
您正在寻求使用Stream的解决方案.这是一:
List sorted = oldList.stream()
.sorted(Comparator.comparing("Chocolate"::equals).reversed())
.collect(Collectors.toList());
System.out.println(sorted);
它给出了:
[Chocolate, Avacado, Apple, Orange]
因此,只有“巧克力”在第一个指数被移动.
但实际上你不需要一个Stream.列表本身就足够了:
oldList.sort(Comparator.comparing("Chocolate"::equals).reversed());
System.out.println(oldList);
结果是
[Chocolate, Avacado, Apple, Orange]
… 相同.
编辑:
我更新了我的答案,因为@Holger指出它违反了Comparator.compare(o1,o2)的合同.我正在使用Holger在他的评论中提出的解决方案.所以他应该被投票,因为我挣扎了两次以获得正确的解决方案.
此方法将每个字符串映射到一个布尔值,该值指出字符串是否等于“巧克力”.在相等的情况下,如果另一个字符串不等于“巧克力”,则Boolean.compare(x,y)将为x返回1,为y返回-1.如果x和y等于“Chocolate”,则结果为0.
由于我们想将“巧克力”移到第一个指数,它的指数必须降低.因此需要一个尊重的比较器(1 => -1和-1 => 1).
标签:java,java-8,java-stream,list
来源: https://codeday.me/bug/20190731/1586886.html