jdk8 ::双冒号操作符(方法引用)

  • 为什么:

java8引入函数式接口之后,如果要在满足函数式接口编程的要求,需要对原来的方法进行改造,定义函数式接口,为了解决这个改造的问题,引入了"::"双冒号操作符。在Java8中,我们可以直接通过方法引用来简写lambda表达式中已经存在的方法,这种特性叫做方法引用(Method Reference)。

  • 是什么

方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法。方法引用提供了一种引用而不执行方法的方式,它需要由兼容的函数式接口构成的目标类型上下文。计算时,方法引用会创建函数式接口的一个实例。

  • 怎么用

有以下四种形式的方法引用:

 

引用对象的实例方法Object::instanceMethodName
引用类的静态方法ClassName::staticMethodName
引用类的实例方法ClassName::methodName
引用构造方法ClassName::new

1.引用对象的实例方法

    private static void instanceMethod(List<String> list) {
        list.forEach(new DoubleColon()::printNormal);
    }

    private void printNormal(String content) {
        System.out.println("引用对象的实例方法测试结果:" + content);
    }

2.引用类的静态方法

    private static void staticMethod(List<String> list) {
        list.forEach(DoubleColon::print);
    }

    private static void print(String num) {
        System.out.println("引用类的静态方法测试结果:" + num);
    }

 

 3.引用类的实例方法

    private static void classInstanceMethod() {
        Banner banner1 = new Banner(1, "b1", null, 2);
        Banner banner2 = new Banner(2, "b2", null, 1);
        List<Banner> bannerList = new ArrayList<Banner>() {
            {
                add(banner1);
                add(banner2);
            }
        };
        bannerList.sort(Banner::compareLocation);
        System.out.println("引用类的实例方法测试结果:" + bannerList);
    }
public class Banner {
    //主键
    private Integer id;
    // 名称
    private String name;
    //链接地址
    private String linkUrl;
    //展示位置
    private Integer localtion;

    public Banner() {
    }

    public Banner(Integer id) {
        this.id = id;
    }

    public Banner(Integer id, String name, String linkUrl, Integer localtion) {
        this.id = id;
        this.name = name;
        this.linkUrl = linkUrl;
        this.localtion = localtion;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getLinkUrl() {
        return linkUrl;
    }

    public void setLinkUrl(String linkUrl) {
        this.linkUrl = linkUrl;
    }

    public int compareLocation(Banner banner) {
        return this.localtion - banner.localtion;
    }

    @Override
    public String toString() {
        return "Banner{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", linkUrl='" + linkUrl + '\'' +
                ", localtion=" + localtion +
                '}';
    }
}

4. 引用构造方法

    private static void cons() {
        Function<Integer, Banner> nann = Banner::new;
        System.out.println("引用构造方法测试结果:" + nann.apply(1));
    }

 执行测试

    public static void main(String[] args) {
        /**第一层大括弧,定义一个匿名内部类
         *第二个大括弧是初始化块(由于匿名内部类没有类名,所以无法定义构造函数,但是可以通过初始化块来完成初始化的工作)
         */
        List<String> list = new ArrayList<String>() {
            {
                add("111");
            }
        };
        instanceMethod(list);
        staticMethod(list);
        classInstanceMethod();
        cons();
    }

测试结果: 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值