Вывести счетчик и строку для первых n элементов из списка строк со значением по умолчанию, когда n> list index-1 - PullRequest
0 голосов
/ 06 февраля 2020

Я сейчас немного поиграюсь с потоками в Java 8 и переписав какой-то код, я столкнулся со следующей ситуацией.

  • У меня есть список строк с динамическими c size.
  • Я хочу распечатать первые пять строк списка или - по умолчанию для всех оставшихся записей, если размер списка меньше пяти.
  • Напечатанное сообщение должно содержать счетчик текущей строки.

Так, например, следующий список:

List<String> strings = Arrays.asList("one", "two");

Должен распечатать:

1: one
2: two
3: -
4: -
5: -

До сих пор я придумал следующее решение:

// Iterating over the existing entries
int i = 1;
for (String string : strings) {
    System.out.println(i++ + ": " + string);
}

// Printing the default lines for all missing ones
IntStream.rangeClosed(i, 5).forEach(n -> System.out.println(n + ": -"));

Почему-то он не выглядит таким чистым, поскольку я дважды использую System.out::println. Есть ли более чистый способ, которым я мог бы переписать это, чтобы все это было в одном потоке?

Ответы [ 2 ]

2 голосов
/ 06 февраля 2020

Как насчет

IntStream.range(0, 5)
    .mapToObj(i -> String.format("%d: %s", i + 1, i < strings.size() ? strings.get(i) : "-"))
    .forEach(System.out::println);

Это самый элегантный способ сделать это всего за один 'l oop'.

Количество строк всегда 5, независимо от длины массива. Мы также не можем передавать только элементы, потому что нам также нужны индексы. Так что strings.stream() не будет работать, как вы уже обнаружили.

Вместо этого мы используем IntStream::range, чтобы обеспечить использование пяти целых чисел. Затем мы сопоставляем каждое целое число с соответствующим элементом или -, если оно выходит за пределы. Наконец, мы печатаем все это, используя ссылку на метод.


Я лично предпочитаю использовать исходные индексы (от 0 до 4) вместо основанных на 1 (от 1 до 5) , Так range(0, 5) вместо range(1, 6) или rangeClosed(1, 5).

0 голосов
/ 06 февраля 2020

Вот еще один простой способ:

    List<String> strings = Arrays.asList("one", "two", "three");
    Iterator<String> it = strings.iterator();

    for (int i=1; i<=5; i++){
        if (it.hasNext()) {
            String str = it.next();
            System.out.println(i + ": " + str);
        }else {
            System.out.println(i + ": -");
        }
    }

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...