今天在研究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,分享到这里,希望你也可以学会哦~