Сопоставить список строк?

Я попытался добавить к каждой строке в List<String>:

List<String> lines = Arrays.asList("one", "two");
List<String> prependedLines = lines.stream().map(line -> "." + line);

но получаю такие ошибки, как

no instance(s) of type variable(s) R exist so that java.util.stream.Stream<R> conforms to java.util.List<java.lang.String>

Как добавить строку к каждому элементу List<String>?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
86
2

Ответы 2

Вам нужно собрать свои результаты:

lines.stream().map(line -> "." + line).collect(Collectors.toList());

В противном случае возвращаемый тип - поток строк, несовместимый с List<String>.

Есть ли короткий способ добавить к каждой строке без импорта сборщиков?

theonlygusti 06.04.2018 16:11

почему бы вам не импортировать это? Так работают стримы!

HBo 06.04.2018 16:12

вы можете добавить статический импорт, такой как import static java.util.stream.Collectors.*;, для записи только collect(toList()).

davidxxx 06.04.2018 16:14

Абсолютно, но это не меняет того факта, что Collectors на самом деле является обязательным импортом для сбора результата ^^

HBo 06.04.2018 16:15

На самом деле есть способ не использовать сборщик, но это явно плохой пример использования Stream (поэтому, пожалуйста, не делайте этого ^^): final List<String> returnList = new ArrayList<>(); lines.stream().map(line -> "." + line).forEach(line -> returnList.add(line)); Здесь нет необходимости в сборщике, но я В самом деле не вижу в этом смысла!

HBo 06.04.2018 16:24

Другой способ, очень лаконичный, без использования потоков, который заменяет элементы списка на месте:

lines.replaceAll(line -> "." + line);

Метод List.replaceAll(...) заменяет каждый элемент списка, применяя данный UnaryOperator.


Обновлено: Если вам нужен новый список с измененными элементами, вы можете просто сначала скопировать исходный список:

List<String> result = new ArrayList<>(lines);
result.replaceAll(line -> "." + line);

А если у вас Java 10+, он еще короче:

var result = new ArrayList<>(lines);
result.replaceAll(line -> "." + line);

Похоже, он меняет список на месте. Мне нужно вернуть новый список без редактирования того, над которым я работаю

theonlygusti 08.04.2018 00:39

Другие вопросы по теме