Я написал код ниже, используя java
.
List<String> list = new ArrayList<String>();
list.add("book1");
list.add("book2");
list.add("book3");
list.add("book4");
String combined = "";
for(int i=0;i<list.size();i++) {
combined = combined + (i+1)+ ". "+list.get(i)+" \r\n";
}
System.out.println(combined);
ВЫХОД
1. book1
2. book2
3. book3
4. book4
Как я могу написать этот код, используя streams
. Я попробовал сделать ниже:
String combined2 = "";
List<String> list2 = IntStream.range(0, list.size()).mapToObj(i->i+1+". "+list.get(i)+" \r\n").toList();
for(String s:list2) {
combined2 = combined2+s;
}
System.out.println(combined2);
Но я не хочу использовать здесь цикл for
. Как я могу улучшить свой подход?
Вы почти там. Вам просто нужно использовать Stream.collect.
Вот модифицированный код.
String list2 = IntStream.range(0, list.size())
.mapToObj(i-> i+1 + ". " + list.get(i))
.collect(Collectors.joining(System.lineSeparator()));
выход:
1. book1
2. book2
3. book3
4. book4
Обратите внимание, что в отличие от оригинала, здесь не добавляется разделитель строк в конце строки (который может быть, а может и не быть тем, что на самом деле желательно). Обязательно добавьте его вручную, если желательно, чтобы строка находилась в конце, а не только между элементами: .collect([...]) + System.lineSeparator()
.
Здесь хорошо подойдет предварительная версия Java 22
Gatherer
, позволяющая избежать необходимости использовать IntStream.