API:http://docs.oracle.com/javase/8/docs/api/
新特性:
http://blog.csdn.net/wangnan537/article/details/49102877
- 接口中定义默认方法,使用关键字default。
public interface DemoInterface{
int calculate(int x, int y);
default int add(int x, int y) {
return x + y;
}
}
子类只需要实现抽象方法add即可,可直接使用minus方法。
public class DemoInterfaceImpl implements DemoInterface() {
public int calculate(int x, int y) {
return add(x + y);
}
}
-
函数式接口
定义:一个接口中仅仅只有一个抽象方法,可加注解@FunctionalInterface,如果接口中的抽象方法多于一个会报错。
可以将lambda表达式当做只有一个抽象方法的接口类型。
四大内置核心函数接口:
1> Consumer<T>:消费型接口
void accpt(T t);
2> Supplier<T>:提供者接口
T get();
3> Function(T, R):函数型接口
R apply(T t);
4> Predicate<T>:断型接口
boolean test(T t); -
lambda表达式
labmda表达式中访问局部变量(隐藏final类型)时,不可改变其值;
如果访问实例的变量或静态变量则可以改变其值。
lambda表达式中不能用默认方法。
lambda表达式结构:
左边:参数列表(不写参数类型也行,可进行类型推断)
中间:箭头->
右边:方法体
lambda表达式的语法格式:
1>无参无返回值:() -> System.out.println("aa");
2>有一个参数,无返回值:
(x) -> System.out.println();
x -> System.out.println();
3>参数两个以上,有返回值:
Comparator<Integer> cop = (x, y) ->{
//other services
return Integer.compare(x, y);
}
4>参数若干,一条返回语句:
Comparator<Integer> cop = (x,y) -> Integer.compare(x, y);
5>参数列表中的数据类型可以省略,jvm可以进行“类型推断”
Comparator<Integer> cop = (Integer x, Integer y) -> Integer.compare(x, y);
Comparator<Integer> cop = (x, y) -> Integer.compare(x, y); -
方法引用
当要传递给lambda表达式体的操作,已经有实现的方法了,可以使用方法引用。
方法引用的参数列表和返回类型必须与函数式接口中的抽象方法的参数列表和返回类型一致。
格式如下:对象::对象方法 类::静态方法 类::对象方法(如果参数列表中的第一个参数是实例方法的调用者,第二个参数是实例方法的参数,可以使用: className::methodName) BiPredicate<String, String> bp = (x,y) -> x.equals(y); BiPredicate<String, String> bp = String::equals;
-
构造器引用:className::new
参数列表和函数式接口中的参数列表保持一致。
Function<String, String> fun = String::new;
System.out.println(fun.apply("fun")); -
数组引用:type[]::new
Function<Integer, String> fun = String[]::new;
System.out.println(fun.apply(3).length);
【==========================未完待续==========================】
- Stream流应用
- Optional,防止空指针
- 新日期
- annotation重复注解
网友评论