Lambda表达式函数式接口要理解Lambda表达式首先要理解函数式接口函数式接口一个接口有并且只有一个方法FunctionalInterface 通过这个来帮你检查接口是否是函数式接口FunctionalInterface interface HanShuInterface{ void func() ; //只有一个func就是函数式接口 void func2() ; //如果加一个func2上面的FunctionalInterface会报错 }函数式接口如何换成Lambda表达式当我们使用Lambda表达式需要知道接口里的方法是什么样的有几个参数返回值是什么1. 函数式接口里的方法 没有参数没有返回值2. 有一个参数没有返回值的方法//有参数没有返回值 FunctionalInterface interface I2{ void func(int a) ; } I2 test (int x) - System.out.println(x); test.func(8); 最后输出8 3. 有两个参数没有返回值//有两个参数没有返回值 FunctionalInterface interface I3{ void func(int a , int b) ; } I3 test (int x , int y) - System.out.println(x y); test.func(8 , 4); 输出 8 4如果方法里有返回值那么方法体需要{}括起来或者 - 4 ; 这个4就代表返回值4. 没有参数有返回值//没有参数有返回值 FunctionalInterface interface I4{ int func() ; } I4 test ()-{return 0;}; int a test.func(); System.out.println(a); a就等于0输出0优化9 就代表返回值9 a就等于9 输出 9 5. 两个参数带返回值最后a 3 b 0 匿名内部类的变量捕获在匿名内部类当中使用过的变量默认把他当成是一个常量 要么这个变量是final修饰的常量 要么这个这个变量没有被修改过int val 0 ; I2 test new I2() { Override public void func(int a) { System.out.println(val); 正常的使用没有问题 val 1 ; 修改val的值这里会报错 System.out.println(a); } }; val 3 ; 如果在这里修改val的值也会报错在匿名内部类里捕获到的变量如果在任何地方修改这个变量的值都会报错Lambda的变量捕获Lambda表达式里使用过的变量这个变量也默认是一个常数不能修改 因为Lambda表达式也是一个匿名内部类Lambda的和集合的使用和方法1.list的forEach() 方法能输出集合里的全部元素ListInteger list new ArrayList() ; list.add(1); list.add(2); list.add(3); 一般调用创建一个内部类重写accept方法 list.forEach(new ConsumerInteger() { Override public void accept(Integer integer) { System.out.println(integer); } }); 用Lambda表达式来写 list.forEach( i - System.out.println(i));2. list的sort() 对集合里的元素排序Comparator 也是一个函数式接口里面只有一个compare方法 list.sort((o1,o2) - o1.compareTo(o2));3. Map的forEach() 输出全部元素BiConsumer 也是一个函数式接口 只有一个accept方法也可以用Lambda表达式用匿名内部类来做 MapString , Integer map new HashMap(); map.put(a , 1) ; map.put(b , 2) ; map.put(c , 3) ; map.forEach(new BiConsumerString, Integer() { Override public void accept(String s, Integer integer) { System.out.println(key: s val: integer ); } }); 用Lambda表达式 map.forEach((key , val) - System.out.println(key: key val: val ));输出key:a val:1key:b val:2key:c val:3Lambda的优缺点优点代码简洁方便缺点可读性差不好调试检测变量捕获问题使用局部变量,而不是成员变量, ;一个局部变量,只在匿名内部类里使用,而成员变量,作用域变大了, 在其他地方 修改 ,就可能会造成问题 ;