Найти значение n шагов от цели в списке с потоком - PullRequest
0 голосов
/ 31 января 2019

Предположим, у меня есть простой список:

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 голосов
/ 31 января 2019

Чтобы построить поверх ответа 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());
0 голосов
/ 31 января 2019

Что-то вроде

    IntStream.range(1, listOne.size())
            .filter(i -> listOne.get(i).equals("test"))
            .mapToObj(i -> listOne.get(i - 1))
            .forEach(item -> listTwo.add(item));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...