假设我有一个简单的列表:
List<String> listOne = Arrays.asList("str1", "result1", "test", "str4", "result2", "test", "str7", "str8");
目标是“test”,我想将目标之前的值添加到新列表中,因此输出将是[result1, result2]
。
用类似 listTwo = listOne.stream().filter(i -> i.equals("test")).collect(Collectors.toList()) 这样的东西添加“测试”值很容易;
但我如何根据目标的位置获取其他位置的值(在我的示例中它只是目标之前的元素)
我尝试将 i
更改为 i - 1
但没有任何效果。
我知道我可以用一个简单的 for 循环来完成,但只是想知道如何将相同的逻辑应用于流。
for (int i = 1; i < listOne.size(); i++) {
if (listOne.get(i).equals("test")) {
listTwo.add(listOne.get(i - 1));
}
}
最佳答案
以 Naman 的回答为基础:
- 您可以直接收集到
List<String>
, 更实用。 - 我也会做
.equals
测试另一种方式,以防列表中的一个元素是null
给你:
List<String> listTwo = IntStream.range(1, listOne.size())
.filter(i -> "test".equals(listOne.get(i))) // stream of indexes of "test" elements
.mapToObj(i -> listOne.get(i-1)) // stream of elements at the index below
.collect(Collectors.toList());
关于java - 使用流在 List 中查找距离目标 n 步的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54464036/