java - 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()) ???
解决方案
您要求使用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)
则返回1
forx
和-1
for 。如果和等于结果是。
当我们要移动到第一个索引时,它的索引必须减小。因此需要一个反向比较器(=>和=> )。y
"Chocolate"
x
y
"Chocolate"
0
"Chocolate"
1
-1
-1
1
推荐阅读
- html - 使没有行的 flex
- python - 提高 pandas 布尔索引的速度
- python - 无论维度如何,如何从张量中选择选定的行?
- angular - 在 ngOnInit 中无法读取未定义的属性“地图”
- python - 给定概率百分比的随机选择成功或失败
- ubuntu - pods 被禁止:用户“system:serviceaccount:kubernetes-dashboard:admin-user”无法在命名空间“default”中列出 API 组“”中的资源“pods”
- haskell - 也许 Haskell 实现
- r - 复制 obs 以适应 df - R 中的其他 obs
- google-bigquery - 在大查询中如何使用 RAND() 对随机 n% 记录进行采样?
- android - Firebase InstanceId:绑定到服务失败:Kotlin