использование Java stream, если строка найдена, затем добавьте в список, а также добавьте дополнительный элемент

#java #lambda #stream

#java #лямбда #поток

Вопрос:

используя потоки, я хочу заполнить массив строк, если найдено совпадение с соответствующими строками, а затем добавить новую строку в массив.

пример этот код вернет список:

   List<String> source = Arrays.asList("one", "two", "three");
    String s ="Two-three-six-seven";

    List<String> target = source.stream()
            .filter(s.toLowerCase()::contains)
            .collect(Collectors.toList());

}
  

создает список (целевой объект) с «двумя» и «тремя» в нем.

как я могу теперь проверить, что, если целевой список имеет значение, я добавляю другое значение, например, «числа», в результате чего получается список, содержащий «два», «три» и «числа»

Я знаю, что это возможно, добавив больше кода вне потока, но я пытаюсь сделать все внутри потока

Комментарии:

1. Каков ожидаемый результат?

2. if (target.contains("two")) target.add("numbers");

3. целевой массив — «два», «три» и «числа». «numbers» — это новый элемент, добавленный, если целевой массив не пуст

4. Я думаю, вы пропустили точку потока. Потоки предназначены для получения набора данных, манипулирования ими и вывода измененного набора данных. Я не буду говорить, что вы не можете добавлять данные с помощью потока, кто-нибудь, вероятно, предложит какой-нибудь хакерский метод сопоставления, чтобы сделать именно это, но это просто не то, для чего предназначены потоки. Самым чистым решением было бы сохранить имеющийся у вас код, а затем добавить дополнительный элемент после факта.

5. Я бы использовал a Set над a List , дополнительно

Ответ №1:

Как прокомментировал @Charlie Armstrong выше, это не очень хорошее использование a Stream . Однако, если вам все равно нужно использовать a Stream по какой-либо причине, вы можете использовать Collectors.collectingAndThen() :

 List<String> target = source.stream()
        .filter(s.toLowerCase()::contains)
        .collect(Collectors.collectingAndThen(Collectors.toList(),
                list -> list.isEmpty() ? list : 
                        Stream.concat(list.stream(), Stream.of("number"))
                                .collect(Collectors.toList())));

System.out.println(target);
  

Вывод

 [two, three, number]