Я попытался добавить к каждой строке в 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>?




Вам нужно собрать свои результаты:
lines.stream().map(line -> "." + line).collect(Collectors.toList());
В противном случае возвращаемый тип - поток строк, несовместимый с List<String>.
почему бы вам не импортировать это? Так работают стримы!
вы можете добавить статический импорт, такой как import static java.util.stream.Collectors.*;, для записи только collect(toList()).
Абсолютно, но это не меняет того факта, что Collectors на самом деле является обязательным импортом для сбора результата ^^
На самом деле есть способ не использовать сборщик, но это явно плохой пример использования Stream (поэтому, пожалуйста, не делайте этого ^^): final List<String> returnList = new ArrayList<>(); lines.stream().map(line -> "." + line).forEach(line -> returnList.add(line)); Здесь нет необходимости в сборщике, но я В самом деле не вижу в этом смысла!
Другой способ, очень лаконичный, без использования потоков, который заменяет элементы списка на месте:
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);
Похоже, он меняет список на месте. Мне нужно вернуть новый список без редактирования того, над которым я работаю
Есть ли короткий способ добавить к каждой строке без импорта сборщиков?