java8的新特性

来源:互联网 发布:记事本软件的英文名 编辑:程序博客网 时间:2024/06/06 17:29
Java语言的新特性1)Lambda表达式概念:java8中增加了一个新的语法--Lambda表达式,并且引入了一个新的操作符(Lambda操作符): -> Lambda操作符 -> :  -> 将Lambda表达式分为两个部分:左侧:指定了Lambda表达式需要的参数,参数的数据类型可以由编译器的“类型推断”机制推断得出,故可以省略。右侧:指定了Lambda表达式的方法体,即Lambda表达式要执行的功能。语法格式:格式一:无参数,无返回值() -> System.out.println("Hello Lambda!");格式二:有一个参数,并且无返回值(x) -> System.out.println(x)格式三:若只有一个参数,小括号可以省略不写x -> System.out.println(x)格式四:有两个以上的参数,有返回值,并且 Lambda 体中有多条语句Comparator<Integer> com = (x, y) -> {System.out.println("函数式接口");return Integer.compare(x, y);};格式五:若 Lambda 体中只有一条语句, return 和 大括号都可以省略不写Comparator<Integer> com = (x, y) -> Integer.compare(x, y);格式六:Lambda 表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出,数据类型,即“类型推断”(Integer x, Integer y) -> Integer.compare(x, y);2)函数式接口概念:只有一个抽象方法(默认方法与静态方法除外)的接口,称为函数式接口。补充:java8中,接口里可以有default方法(默认方法)和static方法(静态方法),实现类默认会继承defaul方法和static方法。eg:Runnable就是一个函数式接口@FunctionalInterfacepublic interface Runnable {void run();}说明:1)可以通过Lambda表达式来创建函数式接口的对象。2)可以在函数式接口上使用@FunctionalInterface注解,这样我们就可以根据该注解来判断这个接口是否是一个函数式接口。3)Java8内置的四个核心函数式接口函数式接口参数类型返回类型抽象方法用途消费型接口:Consumer<T>Tvoidvoid accept(T t)对类型为T的对象执行某一操作。供给型接口:Supplier<T>无TT get()返回类型为T的对象。函数型接口:Function<T, R>TRR apply(T t)对类型为T的对象执行某一操作,并返回R类型的结果。断言型接口:Predicate<T>Tbooleanboolean test(T t)确定类型为T的对象是否满足某约束,并返回boolean值。eg:// 对String类型的对象执行Lambda表达式(x -> System.out.println(x))的方法体。Consumer<String> strConsumer = x -> System.out.println(x);// 创建一个Consumer(消费型接口)的对象strConsumer.accept("Consumer的accept方法!");// 执行Runnable r1 = () -> System.out.println("Hello Lambda!");r1.run();3)方法引用方法引用:说明:1)若Lambda方法体中的功能,已经有方法提供了实现,则可以使用方法引用。2)使用操作符 :: 将方法名和对象或类的名字分隔开来。格式:  对象名 :: 实例方法名  类名   :: 静态方法名  类名   :: 实例方法名eg:Comparator<Integer> com1 = (x, y) -> Integer.compare(x, y);Comparator<Integer> com2 = Integer::compare;构造器引用格式: 类名 :: neweg:Supplier<Student> sup1 = () -> new Student();Supplier<Student> sup2 = Student::new;数组引用格式: type[] :: neweg:Function<Integer, String[]> fun1 = (args) -> new String[args];Function<Integer, String[]> fun2 = String[]::new;