前言

哈喽大家好,我是卡诺,一名致力于成为全栈的全粘工程师!

通过前面两章​​「Lambda必知必会」​​、​​「Lambda内置函数式接口」​​的讲解相信大家对Lambada已经有了比较深刻的认识,通过Lambda确实可以简化我们的代码,但在使用的过程中我们可能会遇到这样一个问题,对于存在的方法Lambda应该怎么使用呢?对于这个问题本章我们继续探讨Java8的另一个功能方法引用

方法引用

方法引用,指重复使用已有的方法定义,在这里表现为通过已有的方法创建Lambda表达式,让代码拥有更好的可读性。如果对这里有疑问,莫要慌,请继续向下看。

如何构建?


  • 语法:​​[类名|对象名]::方法​​;
  • 构建形式:构造方法引用静态方法引用实例方法引用对象方法引用。如下表所示:

引用形式

语法

等效Lambda

备注

构造方法引用

类名::new

(args) -> new 类名(args)

静态方法引用

类名::方法名

(args) -> 类名.方法名(args)

实例方法引用

类名::方法名

(instance,args) -> instance.方法名(args)

instance为lambda传入参数的实例(第一个参数为实例,之后参数为调用方法的方法参数)

对象方法引用

对象::方法名

(args) -> obj.方法名(args)

obj为lambda外部对象(非传入)

实例方法引用、对象方法引用看起来可能会有点晕,可以先记下接下来,我们通过示例来加深对这四种形式的理解!

示例

构造方法引用

构造器参数列表与函数式接口参数保持一致即可替换


  • 无参构造

// Lambda形式
Supplier<Apple> apple = () -> new Apple();
System.out.println(apple.get()); //com.uucoding.java.entity.Apple@305fd85d
// 构造方法引用形式
Supplier<Apple> appleNew = Apple::new;
System.out.println(appleNew.get()); //com.uucoding.java.entity.Apple@11438d26

  • 有参构造(1个参数)

// Lambda形式
Function<String, Person> person = (name) -> new Person(name);
System.out.println(person.apply("卡诺")); //
// 构造方法引用形式
Function<String, Person> personNew = Person::new; // Person(name=卡诺)
System.out.println(personNew.apply("卡诺New")); // Person(name=卡诺New)

如果是两个参数,还可以用BiFunction,参数再多你就得需要自己定义新的函数接口啦!

静态方法引用

静态方法入参和返回值与函数式接口一致即可进行替换!

public void testStatic(){
// Lambda形式
Function<String, Integer> str2Int = (str) -> Integer.valueOf(str);
System.out.println(str2Int.apply("100"));
// 静态方法引用
Function<String, Integer> str2IntNew = Integer::valueOf;
System.out.println(str2IntNew.apply("100"));
}

实例方法引用

函数接口第一参数为实例类型,剩下的参数、返回值类型与实例方法一一对应,可以使用实例方法引用进行替换!

public void testInstance(){
// Lambda形式
BiPredicate<String, String> startsWith = (str, startWithStr) -> str.startsWith(startWithStr);
System.out.println(startsWith.test("卡诺", "卡")); // true
// 实例方法
BiPredicate<String, String> startsWithNew = String::startsWith;
System.out.println(startsWithNew.test("卡诺", "卡"));// true
}

对象方法引用

对象必须在lambda使用之前就得创建,然后lambda内部使用该对象调用对应方法,方法参数、返回值需与函数接口一一对应

public void testObject(){
// Lambda形式
List<Person> container = new ArrayList<>();
Function<Person, Boolean> addFunction = person -> container.add(person);
addFunction.apply(new Person("卡诺"));
System.out.println(container); // [Person(name=卡诺)]
// 对象方法引用
List<Person> containerNew = new ArrayList<>();
Function<Person, Boolean> addFunctionNew = containerNew::add;
addFunctionNew.apply(new Person("卡诺New"));
System.out.println(containerNew); // [Person(name=卡诺New)]
}

通过上述案例,相信大家对方法引用的各种形式应该了熟与心了吧!赶快自己去试试吧!

源码

总结


  • 本章主要针对Lambda方法引用进行讲解和案例编写;
  • 方法引用主要的目的就是让我们使用现有的方法实现并传递他们;
  • 引用方法的四种类型包括:构造方法引用静态方法引用实例方法引用对象方法引用
  • 实例方法引用对象方法引用建议如果理解起来比较矛盾,可以通过案例体会一下就可以区分之间具体的差别。
​​

关联文章

????【再学一次系列】


最后


  • 感谢铁子们耐心看到最后,如果大家感觉本文有所帮助,麻烦给个赞????关注➕
  • 由于本人技术有限,文章和代码可能存在错误,希望大家评论指出,万分感激????;
  • 同时也欢迎大家和我一起讨论学习前端、Java知识,一起卷一起进步。