在带有流的List中找到与目标相距n步的值

ach*_*áin 10 java java-stream

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

List<String> listOne = Arrays.asList("str1", "result1", "test", "str4", "result2", "test", "str7", "str8");
Run Code Online (Sandbox Code Playgroud)

目标是"测试",我想将目标之前的值添加到新列表中,因此输出将是[result1, result2].

使用类似的东西添加"测试"值很容易,listTwo = listOne.stream().filter(i -> i.equals("test")).collect(Collectors.toList());但是如何根据目标的位置获取其他值(在我的示例中,它只是目标之前的元素)

我试着只是改变了ii - 1但没有采取任何行动.

我知道我可以用一个简单的for循环来做,但只是想知道如何在流中应用相同的逻辑.

for (int i = 1; i < listOne.size(); i++) {
    if (listOne.get(i).equals("test")) {
        listTwo.add(listOne.get(i - 1));
    }
}
Run Code Online (Sandbox Code Playgroud)

Ben*_*aye 7

建立在nullpointer的答案之上:

  • 你可以直接收集到一个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());
Run Code Online (Sandbox Code Playgroud)


Nam*_*man 6

就像是

    IntStream.range(1, listOne.size())
            .filter(i -> listOne.get(i).equals("test"))
            .mapToObj(i -> listOne.get(i - 1))
            .forEach(item -> listTwo.add(item));
Run Code Online (Sandbox Code Playgroud)