一,前言
简单的来说就是把方法当成参数传递到stream内部, 使每个元素都传入到该方法里面执行一下, 具体模式:
//类名::方法名
//静态方法引用,通过类名::静态方法名
Integer::parseInt
//实例方法引用,通过实例对象::实例方法
str::substring
Person::getAge
//构造方法引用,通过类名::new
User::new
HsahMap :: new
即函数式编程, JS就是最经典的函数式编程语言(JS提供了强大的功能-闭包,相对于传统方法优势明显, 闭包本身做为一个可调用对象),Java现在提供的最接近闭包的概念便是Lambda表达式, 不过两者还是有着明显的差别的,至少Lambda表达式是闭包很好的替代者。
二,方法引用
可以将方法的引用赋值给一个变量,通过赋值给Function,说明方法引用也是一种函数式接口的书写方式,Lambda表达式也是一种函数式接口,Lambda表达式一般用于自己提供方法体,而方法引用一般直接引用现成的方法。
//// 使用双冒号::来构造静态函数引用
Function<String, Integer> fun = String::length;
Integer value = fun.apply("length");
System.out.println(value);
// 使用双冒号::来构造非静态函数引用
String content = "Hello JDK8";
Function<Integer, String> func = content::substring;
String result = func.apply(1);
System.out.println(result);
// 构造函数引用
BiFunction<String, Integer, User> uFunction = User::new;
User user = uFunction.apply("jiangdalong", 18);
System.out.println(user.toString());
// 函数引用也是一种函数式接口,所以也可以将函数引用作为方法的参数
sayHello(String::toUpperCase, "hello");
// 方法有两个参数,一个是
private static void sayHello(Function<String, String> func, String parameter){
String result = func.apply(parameter);
System.out.println(result);
}