引入
使用匿名内部类(匿名内部类可参考:Java中的匿名内部类)
interface Command { void process(int[] target); } class ProcessArray { public void process(int [] target, Command cmd) { cmd.process(target); } } public class CommandTest { public static void main(String[] args) { ProcessArray pa = new ProcessArray(); int[] arr = {1,2,3,4}; //使用匿名内部类 pa.process(arr, new Command(){ public void process(int[] arr) { int sum =0; for(int k : arr) sum += k; System.out.println(sum); } } ); } }
使用Lambda表达式,可以简化匿名内部类。(部分可以用Lambda表达式代替)
interface Command { void process(int[] target); } class ProcessArray { public void process(int [] target, Command cmd) { cmd.process(target); } } //Java8 新增了Lambda表达式,Lambda表达式完全可用于简化匿名内部类对象 public class CommandTest { public static void main(String[] args) { ProcessArray pa = new ProcessArray(); int[] arr = {1,2,3,4}; //使用Lambda表达式 pa.process(arr, (int[] arr1)-> //不能重复arr,错误: 已在方法 main(String[])中定义了变量 arr { int sum =0; for(int k : arr1) sum += k; System.out.println(sum); } ); } }
Lambda的语法
1. 参数列表。参数列表允许省略形参类型;若只有一个形参,甚至可省略参数列表的圆括号
2. 箭头 ->
3. 代码块。若只有一句,可省略{};
Lambda表达式是有类型的,称为“目标类型(target type)”,它必须是函数式接口(functional interface)。
函数式接口是只包含一个抽象方法的接口。函数式接口可以包含多个默认方法、类方法,但只能有一个抽象方法。
Java8 提供了 @FunctionalInterface 注解,用于编译器检查接口是函数式接口,放在接口定义的前面。
public static void main(String[] args) { //Lambda表达式的返回就是函数式接口的对象 // Runnable 是Java中提供的一个接口,只有一个匿名方法 void run() Runnable r = () -> { int sum = 0; for(int i=0; i<=100; ++i) sum += i; System.out.println(sum); }; r.run(); }
*******************