在具有流的列表中查找距离目标n步的值

时间:2019-01-31 15:33:08

标签: java java-stream

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

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

目标是“测试”,我想将目标之前的值添加到新列表中,因此输出将为[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));
    }
}

2 个答案:

答案 0 :(得分: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());

答案 1 :(得分:6)

类似

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