1. 函数式接口
有且只有一个抽象方法(非Object方法)的接口为函数式接口。
@FunctionalInterface
https://www.runoob.com/java/java8-functional-interfaces.html
2. Lamda表达式
Lambda表达式是对象,是一个函数式接口的实例。
样例:
(Object… args)->expression
args -> expr
(Object… args) -> {函数式接口抽象方法实现逻辑}
// 1. 不需要参数,返回值为 5 () -> 5
// 2. 接收一个参数(数字类型),返回其2倍的值 x -> 2 * x
// 3. 接受2个参数(数字),并返回他们的差值 (x, y) -> x – y
// 4. 接收2个int型整数,返回他们的和 (int x, int y) -> x + y
// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void) (String s) -> System.out.print(s)
a) 在Lambda表达式使用中,Lambda表达式外面的局部变量会被JVM隐式的编译成final类型,Lambda表达式内部只能访问,不能修改。
b) Lambda表达式内部对静态变量和成员变量是可读可写的。
c) Lambda不能访问函数接口的默认方法,在函数接口中可以添加default关键字定义默认的方法
//传统方式使用接口
Transform<String ,Integer> transform1 = new Transform<String, Integer>() {
@Override
public Integer transform(String s) {
return Integer.valueOf(s);
}
} ;
//Lambda方式使用接口
Transform<String,Integer> transform2 = (s)-> Integer.valueOf(s);
3. 方法引用
@FunctionalInterface
public interface Supplier<T> { T get();}
class Car { //Supplier是jdk1.8的接口,这里和lamda一起使用了 public static Car create(final Supplier<Car> supplier) {
return supplier.get();
}
public static void collide(final Car car) { System.out.println("Collided " + car.toString());
}
public void follow(final Car another) { System.out.println("Following the " + another.toString());
}
public void repair() { System.out.println("Repaired " + this.toString());
}}
构造器引用:它的语法是Class::new,或者更一般的Class< T >::new实例如下:
final Car car = Car.create( Car::new );final List< Car > cars = Arrays.asList( car );
静态方法引用:它的语法是Class::static_method,实例如下:
cars.forEach( Car::collide );
特定类的任意对象的方法引用:它的语法是Class::method实例如下:
cars.forEach( Car::repair );
特定对象的方法引用:它的语法是instance::method实例如下:
final Car police = Car.create( Car::new );cars.forEach( police::follow );
public void predicateTest(){
Predicate<String> predicateStr = s -> s.length()>8;
boolean testResult = predicateStr.test("test");//需要api 24
testResult = predicateStr.negate().test("test");//取反,也就是s.length<=8
Predicate<Object> predicateObj = Objects::nonNull;
Object obj = null;
testResult = predicateObj.test(obj);//判断是否为空
}
Function<String, Integer> toInteger = Integer::valueOf;
//toInteger的执行结果作为第二个backToString的输入
Function<String, String> backToString = toInteger.andThen(String::valueOf);
String result = backToString.apply("1234");
System.out.println(result);
Function<Integer, Integer> add = (i) -> {
System.out.println("frist input:" + i);
return i * 2;
};
Function<Integer, Integer> zero = add.andThen((i) -> {
System.out.println("second input:" + i);
return i * 0;
});
Integer res = zero.apply(8);
System.out.println(res);
/**
* Supplier接口:返回一个给定类型的结果。不需要输入参数,无输入有输出
*/
private static void supplierTest(){
Supplier<String> supplier = () -> "我就是输出";
String s = supplier.get();
System.out.println(s);
}
4. 默认方法
默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法。
只需在方法名前面加个 default 关键字即可实现默认方法。
5. Stream
6. Optional
7. 日期