JDK8新特性

目录

一、jdk8包括哪些新特性

二、Lambda表达式

(一)Lambda表达式是JDK8新增的一种语法形式

(二)什么是函数式接口?

(三)格式

 (四)示例

三、方法引用

(一)静态方法引用

(二)实例方法引用

(三)特定类型方法引用

(四)构造方法引用

(五)示例

一、jdk8包括哪些新特性

  1. Lambda表达式
  2. 方法引用
  • 静态方法的引用
  • 实例方法的引用
  • 特定类型方法的引用
  • 构造器引用

二、Lambda表达式

(一)Lambda表达式是JDK8新增的一种语法形式

  • 作用:用于简化函数式接口的匿名内部类

(二)什么是函数式接口?

  • 有且仅有一个抽象方法的接口
  • 注意:大部分的函数式接口都有一个@FunctionalInterface注解,有该注解必定是函数式接口

(三)格式

(被重写方法的形参列表)->{

        被重写方法的方法体代码

}

 (四)示例

@FunctionalInterface //声明是函数式接口
public interface Animal {
    public String run(String name);
}
/**
 * lambda表达式是用于简化实现函数式接口的匿名内部类
 */
public class lambda {
    public static void main(String[] args) {
        //1.匿名内部类写法
        Animal animal = new Animal() {
            @Override
            public String run(String name) {
                return name + "在跑步";
            }
        };
        System.out.println(animal.run("小明"));
        //2.lambda表达式简化
        Animal animal2 = (String name)->{
            return name + "在跑步";
        };
        /**
         * lambda表达式简写规则
         * 1.参数类型可以不写
         * 2.一个参数不需要带括号 无参和多参必须声明括号()
         * 3.如果参数只有一个,参数类型可以省略,同时()也可以省略
         * 4.如果lambda表达式中方法体只有一行代码,可以省略花括号,同时要省略分号!
         * 此时如果这行代码是return语句,return也必须去掉不写
         */
        Animal animal3 = name -> name + "在跑步";

    }
}

三、方法引用

作用:用于简化lambda表达式

(一)静态方法引用

  • 使用方式

 类名::静态方法

  • 使用场景

当lambda表达式里只是调用一个静态方法,并且前后参数的形式一致,就可以使用静态方法引用

(二)实例方法引用

  • 使用方式

 对象名::实例方法

  • 使用场景

当lambda表达式只是调用一个实例方法,并且前后参数的形式一致,就可以使用实例方法引用

(三)特定类型方法引用

  • 使用方式

 类型名::方法

  • 使用场景

如果某个lambda表达式里只是调用一个实例方法,并且前面参数列表中的第一个参数是作为方法的主调,后面的所有参数都是作为该实例方法的入参,则此时就可以使用特定类型的方法引用

(四)构造方法引用

  • 使用方式

 类名::new

  • 使用场景

如果某个lambda表达式只是在创建对象,并且前后参数情况一致,就可以使用构造器引用
 

(五)示例
 

  1. 用于演示的静态方法引用、实例方法引用的自定义类:Student和CompareByAge
public class Student {
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Student() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
public class CompareByAge {
    public static int compareByAge(Student o1,Student o2){
        return o1.getAge() - o2.getAge();
    }

    public int compareByAgeDESC(Student o1,Student o2){
        return o2.getAge() - o1.getAge();
    }
}

     2.用于演示构造器引用的自定义接口:CreteStudent  

@FunctionalInterface
public interface CreteStudent {
    public Student createStudent(String name,int age);
}
public class MethodUse {

    public static void main(String[] args) {
        Student[] students = new Student[3];
        students[0] = new Student("张三", 19);
        students[1] = new Student("李四", 17);
        students[2] = new Student("王五", 21);
        //1.匿名内部类写法
        Arrays.sort(students, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return o1.getAge() - o2.getAge();
            }
        });
        //2.lambda表达式写法
        Arrays.sort(students, ((o1, o2) -> o1.getAge() - o2.getAge()));
        //3.静态方法引用
        //lambda去调用自定义类CompareByAge的compareByAge静态方法
        Arrays.sort(students, ((o1, o2) -> CompareByAge.compareByAge(o1, o2)));
        //使用方法引用改写
        //当lambda表达式里只是调用一个静态方法,并且前后参数的形式一致,就可以使用静态方法引用
        Arrays.sort(students, CompareByAge::compareByAge);

        //4.实例方法引用
        CompareByAge compare = new CompareByAge();
        Arrays.sort(students, (o1, o2) -> compare.compareByAgeDESC(o1, o2));
        //使用方法引用改写
        //当lambda表达式只是调用一个实例方法,并且前后参数的形式一致,就可以使用实例方法引用
        Arrays.sort(students, compare::compareByAgeDESC);

        //5.特定类型的方法引用
        //如果某个lambda表达式里只是调用一个实例方法,并且前面参数列表中的第一个参数是作为方法的主调,后面
        //的所有参数都是作为该实例方法的入参,则此时就可以使用特定类型的方法引用
        String[] names = {"boby", "angela", "Andy", "dlei", "caocao", "Babo", "jack", "Cici"};
        //进行排序(默认是按照字符串的首字符编号进行升序排序
        Arrays.sort(names);
        System.out.println(Arrays.toString(names));

        //要求忽略首字符大小写进行排序
        //1.匿名内部类
        Arrays.sort(names, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.compareToIgnoreCase(o2);
            }
        });
        //2.lambda表达式
        Arrays.sort(names, ((o1, o2) -> o1.compareToIgnoreCase(o2)));
        //3.特定类型方法引用
        Arrays.sort(names, String::compareToIgnoreCase);


        //6.构造器引用
        //1.匿名内部类
        CreteStudent cs = new CreteStudent() {
            @Override
            public Student createStudent(String name, int age) {
                return new Student(name, age);
            }
        };
        //2.lambda表达式
        CreteStudent cs2 = ((name, age) -> new Student(name,age));
        //3.构造方法引用
        //如果某个lambda表达式只是在创建对象,并且前后参数情况一致,就可以使用构造器引用
        CreteStudent cs3 = Student::new;
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值