java - 使用流在 List 中查找距离目标 n 步的值

标签 java java-stream

假设我有一个简单的列表:

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/

相关文章:

java - 使用自定义等于获取对象的重复计数

java - io.jsonwebtoken.security.weakkeyexception : The verification key's size is 48 bits which is not secure enough for the HS256 algorithm

java - Jersey JUnit 测试框架 - 错误状态 500

java - 捕获 "double"热键

java - 有没有办法从后端服务器使用 google play 应用内产品?

具有可从方法调用的三个参数的 Java 函数

java 8 带流的嵌套循环

java - 正则表达式模式停止于 <

java - 如何使用 Java 8 Stream 将 csv 转换为 map

java - 为什么我的 `Stream` 在运行时被关闭?