Java 8 List.foreach()不能修改内部变量问题

List.foreach()不能修改内部变量问题

Java 8 List.foreach()不能修改内部变量问题_第1张图片
可以看到截图中的foreach循环中的变量 allocatedNum,noAllocatedNum等不允许进行修改。
错误信息:Variable used in lambda expression should be final or effectively final

Java 8 List.foreach()不能修改内部变量问题_第2张图片
用普通的for循环时没有问题的

原因

Java 8 List.foreach()不能修改内部变量问题_第3张图片

	default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }

由于这样的写法在多线程的情况下容易产生race condition竞态条件,导致结果不正确,除非我们能强制保证线程安全,这样引发的问题可能更多。
从设计者角度分析,java8提倡大家使用steam流,让大家习惯使用规约操作

你可能感兴趣的:(java,常用)