6. 3 lambda表达式

6.3 lambda表达式

指定时间间隔完成工作,该工作放在了ActionListener中的action performed

方法中;work类继承上述类,构造work类实例

定制比较器完成排序,定义一个长度比较类,再传给sort;实现基于长度排序,而非默认的字典或字符串排序。

Class LengthComparator implements Comparator{};

Array.sort(strings, new LengthComparator);

 

共性:worker类、LengthComparator类传给timer,sort方法。传递的是对象,不是代码段。通过lambda处理代码块。

 

lambda表达式是一个代码块,及必须传入代码的变量规范。希腊字母(入)

第一个lambda表达式:

(String.first,String.second)->first.length()-second.length();

没有参数也要提供括号();

->后面的代码块过多,用{};

 

如果可以推导出类型,可以不用写类型,Comparator 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的函数。

 

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);

 

 

 

你可能感兴趣的:(java)