Java函数式接口之引用与指针的区别

  在C/C++语言中,因为指针的灵活性,能轻松写出简短方便而又神奇的程序。指针是个抽象程度较为低级的概念,即指向某块内存区域的地址而已。带有类型的指针可以指向不同类型内容的地址,解引用时就将该指针指向的地址单元翻译成该类型的内容。比如指向int类型的指针和指向short类型的指针:
          在这里插入图片描述
  由于指针并没有太多的安全机制,并且自由度较大,可以指向任意的地址单元,指针还可以作为地址进行运算,所以对于指针不太了解的人会很容易造成指向错误地址,修改不该修改的内容。

  所以在Java中,使用了引用来替代指针。在底层上,他们都是用于指向相关地址单元。在表层上,引用比指针多了更多的使用限制,从而更加安全。在获得安全的同时,我们不得不牺牲一点灵活性。在C/C++中很容易做到的传递函数,在Java中由于没有指针,不能像C/C++中那样灵活的声明函数指针。通常要实现类似的功能就需要定义一个专用的接口,将该接口的匿名类作为实现当作传递的函数。

终于,在Java 8中,才填补了这一片空白,lambad表达式以及通用函数式接口的实现,将函数式编程成为可能。
在java.util.function包中,定义了很多常用了 函数式接口,和自定义接口以及匿名类作为实现类似,只不过有了标准/公有的函数式接口使合作更为简单便捷。关于函数式接口的使用有三种方式:

  1. 匿名继承实现的方式
  2. lambad表达式的方式
  3. 简化的lambad表达式/实例方法的引用

这里我对树的前序遍历方法进行演示:
带有函数式接口的方法签名:

public void preTravesal(Consumer<TreeNode<? extends E>> action)

三种调用方式:

//1. 匿名继承实现的方式
        r.preTravesal(new Consumer<BinTree.TreeNode<? extends Integer>>() {
            @Override
            public void accept(TreeNode<? extends Integer> t) {
                System.out.print(t);
            }
        });
        
//2. lambad表达式的方式
        r.preTravesal((s) -> System.out.print(s));
        
//3. 简化的lambad表达式/实例方法的引用
        r.preTravesal(System.out::print);

输出结果就不贴了,都是一样并且正确的结果。

第一种方式是老生常谈的,在定义Runnable接口的线程时,Comparator接口的比较器时经常会用到,这里也是一样的原理。

第二种方式lambad表达式在各个博客里都有更加详尽的说明

第三种方式是对一个实例方法的引用,一个方法作为参数传递时能省略的直接参数的书写,比如System.out::print,就可以看作是lambda表达式 e -> System.out.print(e) 的缩写形式。

更深入的阅读:必看:深入学习Java8中的函数式接口

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值