关于java8 Lambda表达式使用 以及变量的使用限制 方法引用

一、Lambda表达式规则

  • 1、lambda表达式里只能引用被final 修饰的本地变量 ,这就是说不能在 lambda 内部修改定义在域外的局部变量,否则会编译错误。
  • 2、局部变量可以不用声明为 final,但是必须不可被后面的代码修改(即隐性的具有 final 的语义)
  • 3、lambda表达式里不允许声明一个与局部变量同名的参数或者局部变量。
    package com.ljg.test;
    import java.util.ArrayList;
    import java.util.List;
    public class LambdaTest02 {
    public static void main(String[] args){
    List<String> lists = new ArrayList<>();
    lists.add("陈天");
    lists.add("龙云");
    int a = 10;
    //lambda表达式便利
    try {
    lists.forEach(l -> {
    String a = "霸道总裁";//规则第3条
    System.out.println("lambda里给 外部局部变量 自动加上了 final 修饰符" + a);//规则第2条,隐式标记为 final常量
    lists.add("宁晓晓");//快速失败,报运行时异常ConcurrentModificationException
    });
    } catch (Exception e) {
    e.printStackTrace();
    }finally {
    a++;//编译不通过,a局部变量已被lambda表达式隐式的编辑为final
    System.out.println("finally输出:" + a);
    }
    //常规for循环
    // for (int i = 0; i < lists.size(); i++) {
    // a++;
    // System.out.println("list元素:" + lists.get(i));
    // }
    }
    }