Java8 新特性 方法引用
什么是方法引用
方法引用可以被看作仅仅调用特定方法的Lamdba表达式的一种快捷方式。比如说Lamdba代表的只是直接调用这个方法,最好还是用名称来调用它,可不用用对象.方法名(),方法引用,引用:就是让你跟据已有的方法来创建一个Lamdba表达式。
并且这么做还有一个好处,就是可以更加清晰明白的理解这行代码的意思。让代码变的优雅起来。
方法引用的简单使用
//比如说有一个Person类,里面有一个getName()方法。
//用Lamdba来使用:用函数类型接口
Function<Person,String> function = (x) -> x.getName();
//等效的方法引
Function<Person,String> function = Person::getName;
//用Lamdba来使用
() -> Thread.currentThread().dumpStack()
//等效的方法引用
() -> Thread.currentThread::dumpStack
//用Lamdba来使用
(str,i) -> str.substring(i)
//等效的方法引用
(str,i) -> String::sbustring;
//经常使用的集合的输出
list.forEach(System.out::println)
上面的小例子来自 《Java8实战》
方法引用的构建
- 指向静态方法的引用。(引用类型中的方法,如:Integer中的sum,min,max等)
- 指向任意类型实例方法的引用(只要传进来,可以用lamdba,就可以用方法引用)
- 指向现有对象的实例方法的引用(自己定义的对象,传进lamdba表达式以后,就可以用方法引用了)
有参数的情况下,编译器会进行类型检查,来确定对于给定的函数式接口,这个方法引用是否有效,并且参数类型是否于上下文匹配。
使用方法引用来构建一个对象
在这里先定义一个javabean,Person ,属性有两个 name , sex ,有一参构造方法,有两参构造方法,无参构造方法
- 用无参方法构建一个对象
@Test
public void test2() {
Supplier<Person> supplier = Person::new;
Person person = supplier.get();
}
- 用一个参数的构造方法来构建一个对象
@Test
public void test2() {
Function<String, Person> function = Person::new;
Person person = function.apply("张三");
System.out.println(person.getName());
//最后输出:张三
}
- 用二个参数的构造方法来构建一个对象
BiFunction<T,U,R> 两个参数来构建一个对象,得用这个函数式接口:
T:第一个参数类型
U:第二个参数类型
R:返回值类型
@Test
public void test2() {
BiFunction<String,String, Person> function = Person::new;
Person person = function.apply("张三","男");
System.out.println(person.getName());
System.out.println(person.getSex());
//输出:张三 男
}
- 如果用多个参数来构建对象(三个或者三个以上)就必须自己写一个函数式接口
//自定义一个函数接口
@FunctionalInterface
public interface ThreeFuntion <T,U,E,R> {
R apply(T t,U u,E e);
//T:第一个参数类型
//U:第二个参数类型
//E:第三个参数类型
//R:返回值类型
}
关注公众号,随时获取最新资讯
细节决定成败!
个人愚见,如有不对,恳请斧正!