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:返回值类型
}



细节决定成败!

个人愚见,如有不对,恳请扶正!

猜你喜欢

转载自www.cnblogs.com/xdtg/p/11988722.html
今日推荐