zoukankan      html  css  js  c++  java
  • 浅析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,分享到这里,希望你也可以学会哦~

  • 相关阅读:
    Nginx作为反向代理时传递客户端IP的设置方法
    通过VNC远程连接Linux实例
    【Office-Word妙手回春】Word文本秒转表格
    如何在Windows7安装U盘中加入USB3.0驱动的支持
    关注mainfest.mf的说明
    netty cs 过高优化
    查看MySql使用的数据库引擎
    DispatcherServlet--研究spring mvc 处理 流程必读源码
    PostConstruct,PreDestroy 注解处理器类 InitDestroyAnnotationBeanPostProcessor
    @autoware 注解处理器
  • 原文地址:https://www.cnblogs.com/ningxinjie/p/13778377.html
Copyright © 2011-2022 走看看