JAVA8新特性之上
Posted owenl-y
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA8新特性之上相关的知识,希望对你有一定的参考价值。
一、Lambda表达式
Lambda是一个匿名函数。可以写出更简洁、更灵活的代码
//匿名内部类
Runnable r1=new Runnable(){
public void run(){
System.out.println("这是一个匿名内部类");
};
}
//Lambda表达式
Runnable r=()->System.out.println("Lambda表达式");
操作符: -> 左侧:指定Lambda表达式需要的参数 右侧:指定了Lambda表达式要执行的功能
语法格式:(parameters) ->expression 或 (parameters) ->{statements;}
1.可选类型声明:参数的数据类型可以省略,因为可由编译器推断出,称为“类型推断”(javac根据上下文,在后台推断出数据类型)
2.可选的参数圆括号:一个参数圆括号可以省略,但无参或者多个参数圆括号不可以省略
3.可选的大括号:如果主体只包含了一个语句,则大括号可以省略
4.可选的return关键字:如果主体只有return 返回值这一条语句,则return关键则可以省略。
二、函数式接口(Function Interface)
定义:只包含一个抽象方法的,但是可以有多个非抽象方法的接口
作为参数传递Lambda表达式;为了将Lambda表达式作为参数出传递,接受Lambda表达式的参数类型必须是与该Lambda表达式兼容的函数式接口的类型。
JAVA内置的四大核心函数式接口:
1、Consumer<T>消费型接口:对类型为T的对象应用操作,包含方法 void accept(T t);
2、Supplier<T>供给型接口: 返回类型为T的对象,包含方法 T get();
3、Function<T,R>函数型接口: 对类型为T的对象应用操作,并返回R类型的对象,包含方法 R apply(T t);
4、Predicate<T> 断定型接口:确定类型为T的对象是否满足某约束,包含方法 boolean test(T t);
三、方法引用
条件:当要传递给Lambda体(->后面的)的操作,已经有了实现的方法了,就可以使用方法引用。(实现抽象方法的参数列表,必须与方法引用方法的参数列表一致)。
1.方法引用: 对象::实例方法
类::静态方法
类::实例方法
如: Consumer c1=n->System.out.println(n); c1.accept("hello");
等同 Consumer c2=System.out::println; c2.accept("hello");
2.构造器引用: ClassName ::new
与函数式接口相结合,自动与函数式接口中的方法兼容。可以把构造器引用赋值给定义的方法,与构造器参数列表要接口中的抽象方法的参数列表一致
class A{ 如: Function<Integer,A> f1=n->new A(n);
A(n){ 等同 Function<Integere,A< f2=A::new;
System.out.println(n);
}
}
3.数组引用: type[]::new
如:Function<Integer,Integer[]> f=n->new Integer[n];
等同于 Function<Integer,Integer[]> f=Integer[]::new ;
以上是关于JAVA8新特性之上的主要内容,如果未能解决你的问题,请参考以下文章