当 n >列表索引 1 时,使用默认值打印字符串列表中的前 n 个元素的计数器和字符串



我目前正在尝试Java 8中的流,通过重写一些代码,我想出了以下情况。

  • 我有一个具有动态大小的字符串列表。
  • 我想打印出列表的前五个字符串,或-为 所有剩余条目的默认值(如果列表大小小于 五。
  • 打印的消息需要包含当前字符串的计数器。

例如以下列表:

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那样干净。有没有一种更干净的方法可以重写它,将它们全部放在一个流中?

怎么样

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

这是在一个"循环"中做到这一点的最优雅的方式。

无论数组的长度如何,您的行数始终为 5。我们也不能只流式传输元素,因为我们还需要索引。所以strings.stream()行不通,正如你已经发现的那样。

我们改用IntStream::range来提供五个整数的使用。然后我们将每个整数映射到相应的元素,或者-如果它超出界限。最后,我们使用方法引用打印整个内容。


我个人更喜欢使用原始索引(0 到 4(而不是基于 1 的索引(1 到 5(。所以range(0, 5)而不是range(1, 6)rangeClosed(1, 5).

这是另一种简单的方法:

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 + ": -");
}
}

祝你好运!

最新更新