Java8新特性玩转JDK8之集合的foreach
功能
接口方法
public interface Iterable<T> {
···
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
···
}
代码示例
public class Main {
public static void main(String[] args) {
ArrayList<Integer> integers = new ArrayList<>();
integers.add(1);
integers.add(2);
integers.add(3);
integers.add(4);
integers.add(5);
integers.forEach(obj -> System.out.print(obj));
}
}
注意事项
- 不能修改包含外部的变量的值,因为本质还是一个方法,对于没有传入的值无法做修改和读取。
- 不能用break或者return或者continue等关键词结束或者跳过循环。
- java8流中所有的操作都是蓄而不发的,只有执行foreach,collect等终结操作时,流的操作才会执行。详情看下方拓展
拓展
- 对流对象 forEach 时,是 terminal不可挽回 操作,因此它执行后,Stream 的元素就被“消费”掉了,你无法对一个 Stream 进行两次 terminal 运算。也就是下方代码是错误的⬇
public class Main {
public static void main(String[] args) {
ArrayList<Integer> integers = new ArrayList<>();
integers.add(1);
integers.add(2);
integers.add(3);
integers.add(4);
integers.add(5);
Stream<Integer> stream = integers.stream();
stream.forEach(obj -> System.out.print(obj));
stream.forEach(obj -> System.out.print(obj));
}
}
- 而具有和forEach相似功能的peek可以实现上方功能
public class Main {
public static void main(String[] args) {
ArrayList<Integer> integers = new ArrayList<>();
integers.add(1);
integers.add(2);
integers.add(3);
integers.add(4);
integers.add(5);
Stream<Integer> stream = integers.stream();
List<Integer> collect = stream.peek(obj -> System.out.print(obj)).
peek(obj-> System.out.println(obj)).collect(Collectors.toList());
}
}
点此跳转原文地址