Как насчет
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)
.