前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java8新特性-----方法引用和构造器引用

Java8新特性-----方法引用和构造器引用

作者头像
大忽悠爱学习
发布2021-11-15 15:11:13
3500
发布2021-11-15 15:11:13
举报
文章被收录于专栏:c++与qt学习c++与qt学习

方法引用和构造器引用


方法引用的概念

若lambda体中的内容有方法已经实现了,我们可以使用方法引用

(我们可以理解为方法引用时lambda表达式的另外一种表现形式)


语法格式

对象::实例方法名

代码语言:javascript
复制
public class TestMain
{
    @Test
    void test()
    {
        PrintStream ps1=System.out;
        Consumer<String> con=(x)->ps1.println(x);

        PrintStream ps=System.out;
        Consumer<String> con1=ps::println;
        con1.accept("大忽悠");
    }
}
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
public class TestMain
{
    @Test
    void test()
    {
        People p=new People("大忽悠",18,3000);
        //lambda的写法
        Supplier<String> ss=()->p.getName();
        System.out.println(ss.get());
        //方法引用的写法
        Supplier<String> s=p::getName;
        System.out.println(s.get());
    }
}
在这里插入图片描述
在这里插入图片描述

注意:

在这里插入图片描述
在这里插入图片描述

类::静态方法名

代码语言:javascript
复制
//Comparator也是一个函数式接口
Comparator<Integer> c=(x,y)->Integer.compare(x,y);
//调用Integer的静态方法compare
Comparator<Integer> c1=Integer::compare;

类::实例方法名

若Lambda参数列表中的第一个参数是实例方法的调用者,而第二个参数是实例方法的参数时,可以使用ClassName::method

代码语言:javascript
复制
        BiPredicate<String,String> bp=(x,y)->x.equals(y);
        BiPredicate<String,String> bp1=String::equals;

要求接口方法的参数必须比引用方法的参数多一个。而且第一个参数要是该引用方法的所在类型的或其父类,除接口方法的第一个参数以外, 其余参数的类型要求一样

代码语言:javascript
复制
class Test1
{
	public void a(int param1, int param2)
	{
		System.out.println("just a test");
	}
 
	public static void main(String[] args)
	{
 
		MyInter m = Test1::a;
	}
}
 
@FunctionalInterface
interface MyInter
{
	//该接口参数比上述的a方法参数数量多一个,除去第一个,其它类型一致(可兼容,如可以一个int,一个Integer)
	//且 interface 中 虚函数的一个参数一定是 引用方法所在类 类型
	void d(Test1 d, int param1, int param2);

注意

  1. lambda体中调用方法的参数列表和返回值类型,要与函数式接口中的抽象方法的函数列表和返回值类型保持一致
  2. 若Lambda参数列表中的第一个参数是实例方法的调用者,而第二个参数是实例方法的参数时,可以使用ClassName::method

构造器引用

需要调用的构造器的参数列表要与函数式接口中的参数列表保持一致

代码语言:javascript
复制
       Supplier<People> supplier=()->new People("大忽悠",18,5000);
        System.out.println(supplier.get());
       //构造器引用的方式:这里对应的是People类中的无参构造器
       Supplier<People> supplier1=People::new;
        System.out.println(supplier1.get());
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
   Function<Integer,People> function=(x)->new People(x);
        System.out.println(function.apply(18));
        //构造器引用
        Function<Integer,People> function1=People::new;
        System.out.println(function1.apply(20));
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
   //构造器引用
        BiFunction<String,Integer,People> function1=People::new;
        System.out.println(function1.apply("大忽悠",18));
在这里插入图片描述
在这里插入图片描述

people类里面的构造函数:

代码语言:javascript
复制
    public People(String name, Integer age, Integer money) {
        this.name = name;
        this.age = age;
        this.money = money;
    }

    public People(String name,Integer age)
    {
        this.name=name;
        this.age=age;
    }
    public People() {
    }
  public People(Integer age)
  {
      this.age=age;
  }

数组引用

代码语言:javascript
复制
      Function<Integer,String[]> function=(x)->new String[x];
        System.out.println(function.apply(10).length);
        //数组引用
        Function<Integer,String[]> function1=String[]::new;
        System.out.println(function1.apply(20).length);
在这里插入图片描述
在这里插入图片描述

详细可参考下面这篇文章

【Java8】 方法引用 讲解

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-08-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 方法引用和构造器引用
  • 方法引用的概念
  • 语法格式
    • 对象::实例方法名
      • 注意:
    • 类::静态方法名
      • 类::实例方法名
      • 注意
      • 构造器引用
        • 需要调用的构造器的参数列表要与函数式接口中的参数列表保持一致
        • 数组引用
          • 详细可参考下面这篇文章
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档