我目前正在尝试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 + ": -");
}
}
祝你好运!