1、方法引用
什么是方法引用?
方法引用指通过方法名指向一个方法。
为什么要使用方法引用?
方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
怎么使用方法引用?
通过一对冒号"::"引用。
实例
- 构造器引用
语法:Class::new或者Class<T>::new
public class Test {
public static Test createInstance(final Supplier<Test> supplier) {
return supplier.get();
}
public static void main(String[] args) {
Test test = Test.createInstance(Test::new);
System.out.println(test);
}
}
@FunctionalInterface
interface Supplier<T> {
T get();
}
- 静态方法引用
语法:Class::staticMethod
public class Test {
public static void main(String[] args) {
ParseInterface parseInterface = Integer::parseInt; //静态方法调用
System.out.println(parseInterface.parse("10") + 5); //15
}
}
@FunctionalInterface
interface ParseInterface {
int parse(String str);
}
- 类对象方法引用
语法:Class::method
public class Test {
public static Test create(final Supplier<Test> supplier) {
return supplier.get();
}
public void myMethod() {
System.out.println("myMethod");
}
public static void main(String[] args) {
Test test01 = Test.create(Test::new);
Test test02 = Test.create(Test::new);
List<Test> tests = Arrays.asList(test01,test02);
tests.forEach(Test::myMethod); //实例方法调用
}
}
- 对象方法引用
语法:instance::method
public class Test {
public static Test create(final Supplier<Test> supplier) {
return supplier.get();
}
public void myMethod(final Test test) {
System.out.println("myMethod");
}
public static void main(String[] args) {
Test test01 = Test.create(Test::new);
Test test02 = Test.create(Test::new);
List<Test> tests = Arrays.asList(test01,test02);
Test test = Test.create(Test::new);
tests.forEach(test::myMethod); //对象方法调用
}
}
2、函数接口应用
目前列举几个java8新特性中较为常用的函数式接口:
接口名称 | 方法声明 | 功能说明 |
Consumer | void accept(T t) | 提供一个参数 |
Supplier | T get() | 得到一个返回值 |
Function<T,R> | R apply(T t) | 通过指定参数返回指定值 |
Predicate | boolean test(T t) | 判断条件是否满足 |
实例:
Comsumer:
public class Test {
public static void main(String[] args) {
Consumer<Integer> consumer = (i) -> System.out.println(i);
consumer.accept(10);
}
}
Supplier:
public class Test {
private static final DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
public static void main(String[] args) {
Supplier<LocalDateTime> supplier = () -> LocalDateTime.now();
System.out.println(supplier.get());
Supplier<String> supplier2 = () -> dtf.format(LocalDateTime.now());
System.out.println(supplier2.get());
}
}
Function<T,R>:
public class Test {
public static void main(String[] args) {
Function<Integer,Integer> function = (i) -> i*50;
System.out.println(function.apply(10));
}
}
Predicate:
public class Test {
public static boolean check(int i,Predicate<Integer> predicate) {
return predicate.test(i);
}
public static void main(String[] args) {
System.out.println(Test.check(2,i -> i < 10));
}
}
3、Java8的默认方法
Java8之前:接口不能有实现方法。
Java8之后:接口可以有带default关键字和static关键字的实现方法。
interface MyInterface{
default void myMethod() {
System.out.println("default方法实现");
}
}
静态默认方法
interface MyInterface{
static void myMethod() {
System.out.println("静态默认方法实现");
}
}
>>> Java8-11新特性总结(四)
>>> Java8-11新特性总结(五)