苹果|Java8中的Lambda总结( 二 )


       System.out.println(\"字典排序:\");
       // 字段排序
       Arrays.sort(plants);
       System.out.println(Arrays.toString(plants));
       // 长度排序
       // Arrays.sort(plants (first second) -> first.length() - second.length());
       Arrays.sort(plants Comparator.comparingInt(String::length));
       System.out.println(\"长度排序:\");
       System.out.println(Arrays.toString(plants));

       Timer timer = new Timer(1000 event ->
           System.out.println(\"The time is \" + LocalDateTime.now())
        );
       timer.start();

       JOptionPane.showMessageDialog(null \"是否退出程序?\");
       System.exit(0);
   

函数式接口函数式接口:只有一个抽象方法的接口
为什么函数式接口必须有一个接口?
在Java 8 中 , 可以在接口中定义默认方法 , 而这种方式不是抽象的或者接口重新声明Object(万物始祖)中的方法 , 这些方法都不在是抽象方法 。
常用函数式接口:
基本类型的函数式接口:
注:其中pq为 intlongdouble;PQ为IntLongDouble
标记注解@FunctionalInterface 用来标记接口为函数式接口 , 如果增加了一个非抽象方法 , 编译器会产生一个错误提示 , 另外javadoc页里也会指出这个接口为函数式接口 。
方法引用使用 :: 操作符分割方法名与对象或类名使用方法如下:
object::instanceMethod
Class::staticMethod
Class::instanceMethod
前两种情况中 , 方法引用等价于提供方法参数的lambda表达式 , System.out.println 等价于 x ->System.out.println(x)
第三种情况 , 第一个参数Class会成为方法的目标 , 如: String::compareToIgnoreCase 等价于 (x. y)-> x.compareToIgnoreCase(y)
如果有多个同名的重载方法 , 编译器就会尝试从上下文中找出你指定的那个一个方法
如:
Arrays.sort(plants Comparator.comparingInt(String::length));
也可以在方法引用中使用this , 例如: this.equlas 等价于 x -> this.equals(x);使用this作为目标 , 会调用给定方法的超类版本 。
在方法引用中还可以使用super形式如下:
super::instanceMethod
例子如下:
import java.awt.event.ActionEvent;
import javax.swing.Timer;

public class Greeter {
   public void greet(ActionEvent actionEvent){
       System.out.println(\"Hello world!\");
   

   class TimedGreeter extends Greeter{
       @Override
       public void greet(ActionEvent actionEvent){
           Timer timer = new Timer(1000 super::greet);
           timer.start();
       
   


构造器引用构造器引用与方法引用类似 , 只不过方法名为new 。 例如: Person::new 是Person的构造器的一个引用 , 具体使用对象的哪个构造器由上下文决定 , 例如包含一个name的Person构造器如下:
ArrayList<String> names = ...;
Stream<Person> stream = names.stream.map(Person::new);
对于构造器引用 , 无法构造泛型T的数组 。
闭包lambda表达式中可以访问外围方法或类中的变量 , 但是lambda捕获的变量必须实际上是最终变量 , 即变量初始化之后就不会在为它赋新值 。
【苹果|Java8中的Lambda总结】import java.awt.Toolkit;
import java.awt.event.ActionListener;
import javax.swing.Timer;