浅析Java之Fucntion

今天在研究HashMap中我个人比较少用到方法的时候发现了这些:

 

 立马勾起了我学C#时的Function的回忆,经过自己研究,发现这个和C#的Function还真的挺像的,但是C#中Function参数可以传递无限多个,而这里的Function参数至多两个,好吧,跟我着我一起看下去吧~~

 

 讲的再清楚,也不如实际使用理解来的快,那么我首先引人一下,如何使用的,然后我们再慢慢剖析:

 输出:

 

 看的出来经过compute后我们指定的key的value变成了我们想要的2倍了,那么它原理到底如何?打开源码看一下:

 

 

 我们可以看到源码内部调用apply传入我们的key与value进行计算得到新的值,然后进行相应的操作

那么为什么我们可以使用lambda表达式进行重写呢?我们打开BiFunction内部看一下:

 

 

 什么意思呢?也就是即使内部我们有另外一个方法如:boolean equals(Object obj),也是仍然可以使用lambda表达式的,因为这个方法的输入参数是类型固定的,如果换成boolean equals(T obj)这些就是不可以使用lambda表达式的了。

当然对于另外一个andThen方法,因为它被重写了,因此相对整个接口而言,我们需要非固定参数的方法只有一个,因此满足使用lambda表达式的规则!

当然对于其他的方法内部剖析和compute是一模一样的,很简单,这里我就不花时间来拆分这些了。 

 

对于Function其实和它是一样的,因此我们仍然需要在使用的时候写lambda表达式就可以重写apply方法,继而完成我们想要的功能,如下方:

    private void TestMethod3(){
        System.out.println(TestFunction("nxj", str -> str + "!"));
    }
    private String TestFunction(String name,Function<String, String> function){
        return function.apply(name);
    }

 

上方代码实现了将字符串【nxj+!】作为一个新的字符串进行返回,注意Function<输入参数类型,输出参数类型>

 

  那么我们自己实现一个结果模拟这个结果的功能吧:

    interface MyFunction<T, U, R> {
        R apply(T t, U u);
        boolean equals(Object obj);
        //这个代码我们暂时调不到
        default <V> MyFunction<T, U, V> andThen(Function<? super R, ? extends V> after) {
            Objects.requireNonNull(after);
            return (T t, U u) -> after.apply(apply(t, u));
        }
    }
    private void TestMethod4(){
        //这里的lambda表达式实际上就是重写apply方法
        System.out.println(TestMyFunction("nxj", "无敌",(k,v)->k.length()+v.length()));
    }
    private Integer TestMyFunction(String str,String str2,MyFunction<String,String,Integer> myFunction){
        return myFunction.apply(str,str2);
    }

 

OK,分享到这里,希望你也可以学会哦~

posted @ 2020-10-07 18:44  程序杰杰  阅读(238)  评论(0编辑  收藏  举报