【发布时间】:2017-08-17 04:48:23
【问题描述】:
任何人都知道如何分别以 Java 8 方式实现以下代码片段是否有任何流方法来检测 forEach 中的第一个元素?
List<String> myList = new ArrayList<String>();
myList.add("A");
myList.add("B");
int i = 0;
for (final String value : myList) {
if (i == 0) {
System.out.println("Hey that's the first element");
}
System.out.println(value);
i++;
}
Java8:
myList.stream().forEach(value -> {
// TODO: How to do something special for first element?
System.out.println(value);
});
此外,假设目标如下(控制台输出):
A Something special
B
C
D
E
F
【问题讨论】:
-
Java8 流是 JVM 中 函数式编程 工具的一部分。因此,流中的任何操作都应该是无状态的,但要区分第一个或任何其他元素是的状态。因此,对于您想要做的事情来说,流 API 是错误的工具。
-
这并不适合使用流和 forEach,它们适用于所有项目的处理都是同质的。您能想出的任何解决方案都是高度人为的,并且一旦您尝试使用并行流,它可能会中断。换句话说,使用
for循环。 -
@PeterParker first
forEach必须替换为forEachOrdered。那么如果你从一个集合中流出会发生什么?不能保证 first 实际上是第一个。最正确的方法是查看 Holger 的绝对必读答案:stackoverflow.com/questions/27547519/…;这是使用自定义 Spliterator。 -
Iterator<String> i=myList.iterator(); if(i.hasNext()) System.out.println("first: " + i.next()); i.forEachRemaining(System.out::println); -
@Holger 这正是我的想法。您会将其作为选项添加到答案中吗?
标签: java for-loop foreach java-8