JDK8新特性之Lambda表达式和方法引用

JDK8新特性之Lambda表达式和方法引用

Lambda表达式

  • Lambda表达式的作用就是简化匿名内部类的写法,如下是其标准格式:
(方法的形参列表) -> {
  方法体代码
}
  • Lambda表达式的省略规则
  1. 参数的数据类型可以省略不写
  2. 如果形参列表中只有一个参数时小括号可以不写
  3. 如果方法体只有一行代码时,花括号可以省略不写,但是方法体代码后面的分号一定要省略
  4. 如果方法体只有一行代码,并且是一条带有return的语句,那么return必须去掉
  • 注意事项
  1. Lambda表达式不能简化所有形式的匿名内部类,只能简化函数式接口的匿名内部类
  2. 函数式匿名内部类就是一个接口中有且仅有一个抽象方法
  • 如下是针对省略规则的例子演示

  • 未简化之前的函数式接口匿名内部类

public class Test {
    public static void main(String[] args) {
        bird bird = new bird() {
            @Override
            public void fly(String name) {
               return name+"正在飞~~";
            }
        };
        System.out.println(bird.fly("小明"));
    }
}

interface bird{
    String fly(String name);
}


  • 使用Lambda表达式简化后的函数式接口匿名内部类
public class Test {
    public static void main(String[] args) {
        // Lambda表达式未简化之前
        bird b = (String name) -> {
            return name+"正在飞~~";
        };

        // 参数的数据类型可以省略不写
        bird b1 = (name) -> {
            return name+"正在飞~~";
        };

        // 如果形参列表中只有一个参数时小括号可以不写
        bird b2 = name -> {
            return name+"正在飞~~";
        };

        // 如果方法体只有一行代码时,花括号可以省略不写,但是方法体代码后面的分号一定要省略
        // 如果方法体只有一行代码,并且是一条带有return的语句,那么return必须去掉
        bird b3 = name -> name+"正在飞~~";
    }
}

interface bird{
    String fly(String name);
}



方法引用

  • 方法引用的作用是进一步简化Lambda表达式,其标志是使用"::"符号

  • 静态方法引用

  1. 先在一个类中定义一个静态方法,在静态方法里重写我们所要简化的匿名内部类的方法体代码
  2. 在要简化的Lambda表达式的形参列表要和静态方法中的形参列表一模一样
  3. 使用类名:方法名的形式简化Lambda表达式
public class Demo {
    public static void main(String[] args) {
        // 按照对象年龄升序排序
        Student students[] = new Student[3];
        students[0] = new Student("小明",18);
        students[1] = new Student("小白",16);
        students[2] = new Student("小王",20);
        // 原式
        Arrays.sort(students,(o1, o2) -> {
            return o1.getAge()-o2.getAge();
        });

        // 静态方法引用简化后的式子
        Arrays.sort(students,Sort::sortAge);
        for (Student student : students) {
            System.out.println(student);
        }
    }
}

class Sort{
    public static int sortAge(Student o1, Student o2){
        return o1.getAge() - o2.getAge();
    }
}

  • 实例方法引用
  1. 在一个类中定义一个实例方法,里面重写我们所要简化的匿名内部类的方法体代码
  2. 在要简化的Lambda表达式的形参列表要和实例方法中的形参列表一模一样
  3. 最后把Lambda表达式该为对象::方法名即可
public class Demo {
    public static void main(String[] args) {
        // 按照对象年龄升序排序
        Student students[] = new Student[3];
        students[0] = new Student("小明",18);
        students[1] = new Student("小白",16);
        students[2] = new Student("小王",20);
        // 原式
        Arrays.sort(students,(o1, o2) -> {
            return o1.getAge()-o2.getAge();
        });

        // 静态方法引用简化后的式子
        Arrays.sort(students,new Instance()::sortAge);
        for (Student student : students) {
            System.out.println(student);
        }
    }
}

class Instance{
    public int sortAge(Student o1, Student o2){
        return o1.getAge() - o2.getAge();
    }
}

  • 特定类型方法引用
  1. 如果某一个Lambda表达式里只是调用了一个实例方法,并且前面的参数列表中的第一个参数作为方法的主调,后面的所有参数都是该实例方法的参数,则此时可以使用特定类型的方法引用
  2. 最后把Lambda表达式改为数据类型::方法名
  3. 这里的类型指的是参数的数据类型
public class Demo {
    public static void main(String[] args) {
        String names[] = {"body","angela","Andy","daling","caocao","Bob","jack","Cici"};

        // 要求忽略首字符大小写进行排序 使用o1.compareToIgnoreCase(o2)字符串提供的忽略大小写比较大小
        // 原式
        Arrays.sort(names,((o1, o2) -> o1.compareToIgnoreCase(o2)));

        // 使用特定方法引用简化后的Lambda表达式
        Arrays.sort(names,String::compareToIgnoreCase);

        System.out.println(Arrays.toString(names));
    }
}

  • 构造器引用
  1. 如果Lambda表达式只是为了创建一个对象,并且前后参数一致,就可以使用构造器引用
  2. 最后把Lambda表达式改为类名::new即可
public class Demo {
    public static void main(String[] args) {
        // 原式
        constructor cc = (name,age) -> new Student(name,age);

        // 使用构造器引用简化后的Lambda表达式
        constructor c = Student::new;

        Student student = c.create("乾巧", 18);
        System.out.println(student);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值