Преобразование List Iteration в forEach с условием

У меня есть список предметов. Я повторяю список, и если следующий элемент присутствует в списке, я добавляю запятую, и если это последний элемент, я добавляю "!".

Можно ли это сделать с помощью 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 16.08.2018 10:58

@Aaron, я проверю, больше ли размер списка 0 перед повторением цикла .. не знаю, как использовать i + 1 в forEach

JavaLearner1 16.08.2018 11:01

Возможно, в этом нет необходимости, поскольку после выхода из цикла вы сразу после последнего элемента. Все текущие ответы основываются на этом факте, но это приводит к выводу ! для пустых списков, что, возможно, было неверным.

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

Ответы 5

list1.forEach((k,s) -> {
    sb.append(s);
    if (k + 1 < list1.size()) {
        sb.append(",");
    } else {
        sb.append("!");
    }
});

Если вы хотите найти другой пример с использованием forEach, см. Этот ссылка на сайт.

OP использует List, у которого нет метода forEach, который принимает BiConsumer. Какой метод вы используете? Это больше похоже на list1 - это Map.

Slaw 16.08.2018 11:04

Вы можете попробовать использовать потоки. Решение с использованием метода 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.

marstran 16.08.2018 11:01
Ответ принят как подходящий

Похоже, вам стоит использовать функцию 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());

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