java实现回调函数

在一些动态语言中,如python,JavaScript等比较灵活,有函数指针的概念【C语言中的函数指针】。其意思是把一个函数当成一个参数传递到另一个函数中,在合适的时候,为指定参数提供运行入口,实现隐式控制内部参数。

引出问题

这里引出问题:假如需要设计一个要求,需要对二叉树中每一个节点设计一个自定义访问的要求,即需要外界传递一个要求【抽象为函数】,对内部遍历每一个节点实现自定义访问,你会如何设计呢??

在python等动态语言中,可能你会想到使用一种叫回调函数的设计方式。简单用代码解释以下

这里对一个数组中的每一个元素访问,模拟外界的自定义要求为对每一个迭代的元素都加100的自定义操作【这里只是简单的加100自定义,真正业务代码不会那么简单】,代码如下:

In [1]: def backing(l,fun):
   ...:     for i in l:
   ...:         fun(i)
   ...:

In [2]: def fun(i):
   ...:     print(i+100)
   ...:

In [3]: backing([1,2,3,4,5,6],fun)
101
102
103
104
105
106

那么在java中又如何实现呢? 对java有一定了解的小伙伴肯定知道java压根就没有这样的语法和规定,那么java是如何实现这个要求呢? 这里就需要知道一下java是有接口这个概念的!不知道接口的小伙伴可以自行百度一下,很简单~

实现方式如下:

public class test {
    public static void main(String[] args) {
    //外界实现这个访问器接口来对Demo内部数据的自定义访问,这里也可以使用lambda实现
        Demo<Integer> demo = new Demo<Integer>(new Demo.Visitor<Integer>() {
            @Override
            public void visit(Integer integer) {
                System.out.println(integer+100);
            }
        });
        Integer[] arr = {1,2,3,4,5,6,7,8,9,10};
        demo.print(arr);
    }

}
@SuppressWarnings("unchecked")
class Demo <E>{
    private Visitor<E> visitor=null;
    //构造器提供一个有参,让外界传递一个访问器给内部
    public Demo(Visitor<E> visitor){
        this.visitor = visitor;
    }
    public Demo(){
    }

    public void print(E[] arr){
        for (E e : arr) {
        //假如visitor不为空即使用访问器实现外部对内部数据的自定义访问
            if(visitor!=null){
                visitor.visit(e);
            }else{
                System.out.println(e);
            }

        }
    }
    //设计一个访问器接口供外界实现
    public interface Visitor<E> {
        void visit(E e);
    }
}

好了,以上就是所有内容了~~~

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

践行~渐远

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值