1.环境的配置:
https://github.com/evant/gradle-retrolambda
2.JAVA8 新特性
2.1接口的默认方法和静态方法
8允许我们给接口添加一个默认方法,用default
修饰即可。默认方法可以重写。
在Android中要求最低为API24以上
public interface IMyInterface { void onMethond(String str);//这是一个抽象方法 default String onDefalutMethod(){//这是一个默认方法 return "这是一个默认方法"; } static String onStaticMethod(){ return "这是一个静态方法"; }}
2、 函数式接口(Functional Interface)
什么叫函数式接口?他和普通接口有什么区别?
“函数式接口”是指仅仅只包含一个抽象方法的接口(可以包含默认方法和静态方法),其他特征和普通接口没有任何区别,中Runnalbe,Callable等就是个函数式接口;。我们可以给一个符合函数式接口添加@FunctionalInterface
注解,这样就显式的指明该接口是一个函数式接口,如果不是,编译器会直接提示错误。当然你也可以不用添加此注解。添加的好处在于,由于Lambda表达式只支持函数式接口,如果恰好这个接口被应用于Lambda表达式,某天你手抖不小心添加了个抽象方法,编译器会提示错误。 3、方法与构造函数引用
public class Person { private String name; private int age; public Person(){ } public Person(String name,int age){ this.name=name; this.age=age; } 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 static String show(String str){ System.out.println("----->输入"+str); return "----->返回"+str; }}
下面的例子都会以Person为例
- 使用
::
关键字初始化构造函数,返回的是一个函数式接口,这个接口可以自己定义,也可以直接使用系统提供的函数式接口。现在先来定义一个函数式接口用于获取Person实例。
@FunctionalInterfacepublic interface PersonSupply { Person get();}
接下来写一个接口的实现,如果按照常规写法,写出来的代码一般会是如下形式。
PersonSupply sp=new PersonSupply{ public Person get(){ Person person=new Person(); return person; }}Person person=sp.get();//获取实例
而自从Java8引入::
关键字后,就可以简化为一行代码,简直不要太简洁。
PersonSupply sp=Person::new; //接口实现Person person=sp.get();//获取实例
当然为了使这个接口更通用,我们可以定义成如下形式
@FunctionalInterfacepublic interface PersonSupply{ T get();}PersonSupply sp=Person::new;Person person=sp.get();
java8自带的Supplier
接口就是这样实现的,后面会做介绍。直接使用Supplier
如下
Suppliersp=Person::new;Person person=sp.get();
这种简便写法同样支持带参构造函数,首先写一个函数式接口,由于需要参数所以get()里面输入参数,返回Person,如下。
@FunctionalInterfacepublic interface PersonSupply{ P get(String name, int age);}
常规的写法:
PersonSupplysp=new PersonSupply { public Person get(String name, int age);{ Person person=new Person(name,age); return person; }}Person person=sp.get("maplejaw",20);
http://blog.csdn.net/maplejaw_/article/details/51348162