Java8新特性玩转JDK8之集合的foreach

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);
        // 输出12345  注意输出是print所有没有换行
        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();
        // 报错java.lang.IllegalStateException: stream has already been operated upon or closed
        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();
        /*
         * 输出👇 原因请看注意事项最后一点
         * 11
         * 22
         * 33
         * 44
         * 55
         */
        List<Integer> collect = stream.peek(obj -> System.out.print(obj)).
                peek(obj-> System.out.println(obj)).collect(Collectors.toList());
    }
}

点此跳转原文地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值