• 浅析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,分享到这里,希望你也可以学会哦~

  • 相关阅读:
    cut的使用
    linux三剑客之一 sed
    uniq指令
    CF940A Points on the line 思维
    2018年全国多校算法寒假训练营练习比赛(第二场) B TaoTao要吃鸡 01背包变形题
    CF922A Cloning Toys
    牛客网 Wannafly挑战赛 C 列一列 简单题 (题目有点坑)
    牛客网 Wannafly挑战赛 A 找一找 思考题
    B. Tea Queue codeforces Round.37.div2 队列
    线段树+离散化 poj 2528 Mayor's posters
  • 原文地址:https://www.cnblogs.com/ningxinjie/p/13778377.html
Copyright © 2020-2023  润新知