6.3 lambda表达式
指定时间间隔完成工作,该工作放在了ActionListener中的action performed
方法中;work类继承上述类,构造work类实例
定制比较器完成排序,定义一个长度比较类,再传给sort;实现基于长度排序,而非默认的字典或字符串排序。
Class LengthComparator implements Comparator<String>{};
Array.sort(strings, new LengthComparator);
共性:worker类、LengthComparator类传给timer,sort方法。传递的是对象,不是代码段。通过lambda处理代码块。
lambda表达式是一个代码块,及必须传入代码的变量规范。希腊字母(入)
第一个lambda表达式:
(String.first,String.second)->first.length()-second.length();
没有参数也要提供括号();
->后面的代码块过多,用{};
如果可以推导出类型,可以不用写类型,Comparator<String> comp = (first, second) -> first.length()-second.length(),编译器可以自动推导出参数为字符串,lambda表达式赋给一个字符串比较器;
方法只有一个参数,可推导出参数,可不用写小括号();
ActionListener listener = event -> System.out.println(“the time is” + new Date());
无需指定lambda表达式返回类型,上下文推导得出。(String.first,String.second)->first.length()-second.length();
只返回一些分支,另外一些分支不返回,lambda中不合法。
函数式接口必须只有一个抽象方法。
Arrays.sort()方法第二个参数需要一个Comparator实例,只有一个方法的接口,可提供一个lambda表达式。
lambda转换为接口,Timer t = new timer(1000, event -> System.out.println(“the time is” + new Date())).
java.util.function包中的BiFunction<T, U, R>描述类参数类型T,U和返回类型R的函数。
ava.util.function中有一个有用的接口predicate,中有一个test(T t)方法,判断是否相等,返回布尔值。
ArrayList类的removIf方法参数为Predicate,该接口专门传递lambda表达式。将数组列表中的所有null删除,list.removeIf(e -> e==null);
方法引用,表达式System.out::println是一个方法引用,等价于x->System.out.println(x);
::操作符分割方法名与对象或类名,
supper:: greet();调用父类的greet方法。
构造器引用,Person::new 是person构造器的一个引用,通过上下文确定是哪一个构造器。
数组类型建立构造器引用,int[]::new,等价于x->new int[x];
lambda表达式,只能引用值不会改变的变量。不能在lambda表达式中对捕获的外部变量进行运算。循环体中的变量,表达式代码块也不能引用。
不能有两个同名的局部变量。
lambda表达式中的this,指创建表达式方法的this参数,对象类。
使用lambda表达式的重点是延迟执行。延迟执行的原因是:1.在一个单独的线程中运行代码;2.多次运行代码;3.算法的适当位置运行代码;4.发生某种情况时运行代码;5.必要时运行代码。
重复一个动作n次的repeat方法,接受这个方法中的lambda表达式,选择一个函数式接口,可用runnable接口。
常用函数式接口,基本类型的函数式接口。
@FuctionalInterface 注解用于指示一个接口只能定义一个抽象方法
按名字对Person对象排序
Array.sort(people, Comparator.comparing(Person::getName));
如姓相同,就比较名。
Array.sort(people, Comparator.comparing(Person::getLastName).thenComparing(Person::getFirstName);