У меня есть список предметов. Я повторяю список, и если следующий элемент присутствует в списке, я добавляю запятую, и если это последний элемент, я добавляю "!".
Можно ли это сделать с помощью forEach вместо использования цикла for?
List<String> list1 = new LinkedList<>();
StringBuilder sb = new StringBuilder();
list1.add("one");
list1.add("two");
list1.add("three");
list1.add("four");
list1.add("five");
for(int i=0; i<list1.size();i++) {
sb.append(list1.get(i));
if (i+1 < list1.size()) {
sb.append(",");
} else {
sb.append("!");
}
}
Я старался..
list1.forEach(s -> {
sb.append(s);
if () { // not sure how to check if next element is present..
sb.append(",");
} else {
sb.append("!");
}
});
Как проверить условие i + 1 в forEach ...
@Aaron, я проверю, больше ли размер списка 0 перед повторением цикла .. не знаю, как использовать i + 1 в forEach
Возможно, в этом нет необходимости, поскольку после выхода из цикла вы сразу после последнего элемента. Все текущие ответы основываются на этом факте, но это приводит к выводу ! для пустых списков, что, возможно, было неверным.




list1.forEach((k,s) -> {
sb.append(s);
if (k + 1 < list1.size()) {
sb.append(",");
} else {
sb.append("!");
}
});
Если вы хотите найти другой пример с использованием forEach, см. Этот ссылка на сайт.
OP использует List, у которого нет метода forEach, который принимает BiConsumer. Какой метод вы используете? Это больше похоже на list1 - это Map.
Вы можете попробовать использовать потоки. Решение с использованием метода Collectors.joining:
list1.stream().collect(Collectors.joining(",")).concat("!");
Решение с использованием сокращения потока:
list1.stream().reduce((a, b) -> a.concat(",").concat(b)).map(a -> a.concat(",")).orElse("");
И, конечно, если вы не хотите использовать потоки, вы можете сделать следующий вызов цепочки forEach.
list1.forEach(s -> sb.append(s).append(','));
String str = sb.toString().concat("!");
Нет необходимости создавать Stream, если у вас есть функция join на String.
Похоже, вам стоит использовать функцию String.join. Что-то вроде этого:
String.join(",", list1) + "!"
Это сработало для меня. Если список пуст, StringBuffer тоже, потому что он не войдет в часть foreach.
list1.forEach(s -> {
sb.append(s);
if (list1.indexOf(s) + 1 != list1.size()) {
sb.append(",");
} else {
sb.append("!");
}
});
Если вы должны использовать forEach, то сработает следующее:
StringJoiner sj = new StringJoiner(",", "", "!");
list1.forEach(l -> sj.add(l));
System.out.println(sj.toString());
Как должен отображаться пустой список? Пустая строка или одиночный
!?