Java 8 辣么大(lambda)表达式不慌之一—–Function

用java 8 的辣么大(lambda)表达式的时候肯定用到过Function<T, R> 这个东西,但是在我刚刚用的时候他的写法让我很别扭,很不适应,所以就不得不去打开他的源码看看他到底儿是个什么鬼。

看起来这个接口挺简单的,下面总共也就4个接口俩default、一static。
先看看接口说明:Represents a function that accepts one argument and produces a result. 接收一个参数返回一个结果,就这么简单,就像y=f(x)这么简单。f(x)=x+1,写成java代码就是:

Function<Integer,Integer> myFun = (x)->{return x+1;
};

再看定义的方法:

第一个方法R apply(T t);
    /*** Applies this function to the given argument.** @param t the function argument* @return the function result*/R apply(T t);

这个方法简单,就是用给的参数去执行这个方法,得到结果(有没有感觉跟那个invoke有点像的感觉?)。拿上面的举例子:f(x)=x+1 所以 y=x+1,如果x=1那么执行一下就是y=1+1。写成java代码就是:

// myFun就是上面定义的myFUn
Integer applyResult = myFun.apply(1); // applyResult =2
第二个方法Function<V, R> compose(Function<? super V, ? extends T> before)
default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {Objects.requireNonNull(before);return (V v) -> apply(before.apply(v));
}

这个方法的返回值还是一个Function,参数也是一个Function。从方法的注释,或者方法的实现可以看出来(通常我们看到一个方法,先看注释,大概就知道方法是做什么的,怎么使用,然后再看实现与注释相佐证)这个方法是先apply参数里面的Function然后返回一个Function。举个栗子,就是现在有2个函数:y=f(x),z=f(x),所以如果2个函数y=x+1,z=x*3那么此处就是y=(x*3)+1。写成java代码就是:

Function<Integer,Integer> plus = (x)->{return x+1;
};Function<Integer,Integer> multip = (x)->{return x*3;
};
Integer apply = plus.compose(multip).apply(2); // 此处执行的就是2*3+1=7
// 两个Funtion的调用反过来一下
Integer overApply = multip.compose(plus).apply(2); // 此处执行的就是(2+1)*3=9
第三个方法Function<T, V> andThen(Function<? super R, ? extends V> after)
default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {Objects.requireNonNull(after);return (T t) -> after.apply(apply(t));
}

第三个方法一看实现就知道了跟第二个方法是反过来的,直接看代码:

Function<Integer,Integer> plus = (x)->{return x+1;
};Function<Integer,Integer> multip = (x)->{return x*3;
};
Integer apply = plus.andThen(multip).apply(2); // 此处执行的就是(2+1)*3=9
// 两个Funtion的调用反过来一下,跟上面的一样
Integer overApply = multip.andThen(plus).apply(2); // 此处执行的就是2*3+1=7

看完之后有木有晕?有木有感觉下面这个andThen有点多余?我感觉有略微有点多余…

第四个方法static <T> Function<T, T> identity()
    /*** Returns a function that always returns its input argument.** @param <T> the type of the input and output objects to the function* @return a function that always returns its input argument*/static <T> Function<T, T> identity() {return t -> t;}

这个方法返回一个Function,这个Function返回他的参数,类似于y=f(x)的 y=x。写成java代码就是:

Function<Integer, Integer> identity = Function.identity();
Integer apply = identity.apply(5); // apply=5

这个方法看的我有点萌币,不知道哪里用的到,如果有朋友知道这方法在哪里用,怎么用,请告知,谢谢了!


上面的方法整半天都是只能传一个请求参数,然后返回一个值的,万一有多个参数呢?找一下同一个包下面的其他类,发现Function有个大兄deipublic interface BiFunction<T, U, R>

这个大兄dei的注释上说了,他有两个参数,一个返回值,然后下面只有2个方法,一个是apply方法,执行Function,另一个是andThen方法,咦,compose方法怎么没了?
先不管了,先来试试他的第一个方法R apply(T t, U u);

BiFunction<Integer,Integer,Integer> plus = (x,y)->{return x+y;
};BiFunction<Integer,Integer,Integer> multip = (x,y)->{return x*y;
};Integer apply = plus.apply(3, 2); // 3+2=5
Integer apply1 = multip.apply(3, 2); // 3*2=6

再看第二个方法

    default <V> BiFunction<T, U, V> andThen(Function<? super R, ? extends V> after) {Objects.requireNonNull(after);return (T t, U u) -> after.apply(apply(t, u));}

返回的是个BiFunction,但是参数是个Function,这样的话,可以这么写:

BiFunction<Integer, Integer, Integer> multip = (x, y) -> {return x * y;
};
Function<Integer, Integer> sqr = (x) -> {return x * x;
};
Integer apply = multip.andThen(sqr).apply(3, 5); //(3*5)*(3*5)= 225

他是这么执行的,先执行2个参数的就是上面的multip 方法,然后得到一个结果,再将结果当做参数去执行只有一个参数的sqr方法。所以难怪没有反过来执行的compose方法了,因为不能同时得到2个返回值,所以只能先执行BiFunction方法了。

Java 8 辣么大(lambda)表达式不慌之-----(一)Function相关推荐

  1. Java 8 辣么大(lambda)表达式不慌之—–(五)示例-Collectors中的统计、分组、排序等

    Java 8 辣么大(lambda)表达式不慌之-–(五)示例-Collectors中的统计.分组.排序等 summarizingInt 按int类型统计 maxBy取最大/minBy取最小 aver ...

  2. Java 8 辣么大(lambda)表达式不慌之—–(三)Consumer

    Java 8 辣么大(lambda)表达式不慌之-–(三)Consumer 在动用辣么在表达式的时候也会用到这个函数Consumer<T>,他的定义是:Represents an oper ...

  3. Java 8 辣么大(lambda)表达式不慌之-----(二)Predicate

    Java 8 辣么大(lambda)表达式不慌之-–(二)Predicate 在动用辣么在表达式的时候经常会用到这个函数Predicate<T>,他的定义是:Represents a pr ...

  4. Java 8 辣么大(lambda)表达式不慌之—–(四)示例-Collectors中的中的joining 方法和mapping方法

    Java 8 辣么大(lambda)表达式不慌之-–(四)示例-Collectors中的joining 方法和mapping方法 joining 方法 mapping方法 先定义好后面做示例要用的数据 ...

  5. Java 函数式编程和 lambda 表达式

    为什么要使用函数式编程 函数式编程更多时候是一种编程的思维方式,是种方法论.函数式与命令式编程的区别主要在于:函数式编程是告诉代码你要做什么,而命令式编程则是告诉代码要怎么做.说白了,函数式编程是基于 ...

  6. Java 8中使用Lambda表达式的策略模式

    策略模式是" 设计模式:可重用对象的元素"书中的模式之一 . 本书所述的策略模式的意图是: 定义一系列算法,封装每个算法,并使它们可互换. 策略使算法独立于使用该算法的客户端而变化 ...

  7. 精通lambda表达式:java多核编程_Java8 Lambda表达式和流操作如何让你的代码变慢5倍...

    有许许多多关于 Java 8 中流效率的讨论,但根据 Alex Zhitnitsky 的测试结果显示:坚持使用传统的 Java 编程风格--iterator 和 for-each 循环--比 Java ...

  8. Java基础教程:Lambda表达式

    Java基础教程:Lambda表达式 引入Lambda Java 是一流的面向对象语言,除了部分简单数据类型,Java 中的一切都是对象,即使数组也是一种对象,每个类创建的实例也是对象.在 Java ...

  9. Java 8 新特性 lambda表达式

    / Created by Manager on 2021/4/1. Java 8 新特性 lambda表达式 StreamAPI 新日期 新注解 */ 视频连接 1https://www.bilibi ...

最新文章

  1. 2017美国人工智能和机器学习行业种子投资首次下降
  2. 2021-06-082021年春季学期-信号与系统-第十五次作业-第四小题参考答案
  3. php是什么症状脾虚什么症状怎么治,脾虚的5个症状是什么呢
  4. Linux目录、文件的创建与删除
  5. 2018-03-26
  6. 链方法[C# 基础知识系列]专题三:如何用委托包装多个方法——委托链
  7. 删除git库中untracked files(未监控)的文件
  8. python 接口自动化_Python 接口自动化测试
  9. html 答题一题一题展示,在线答题系统如何展示考试结果
  10. DirectX9 ShadowMap例子学习笔记
  11. goland 注释模板_Java程序员简历模板,怎样才是一份好的技术简历
  12. Job和CronJob介绍
  13. python中offset的意思_python覆盖从offset1到offset2的字节
  14. AcWing蓝桥杯AB组辅导课10、疑难杂题
  15. 什么是 GraphQL?
  16. python学习13:分解质因数
  17. Linux点名系统代码,Linux Shell 点名脚本小练习
  18. root = Tk() 和 root = Tkinter.Tk() 区别
  19. java-php-python-ssm药房管理系统计算机毕业设计
  20. telegram实时翻译bot_有写过 telegram bot 的大佬吗,请问如何让机器人获取自己说的话?...

热门文章

  1. 一阶rc matlab,matlab – 一阶RC滤波器的时间离散实现
  2. Appium 不懂就问,Appium 小白,在微信切换 webview 时遇到 Original error: unknown error: Failed to get PID for
  3. 回归分析(三)——多项式回归解决非线性问题
  4. c# 实现线程安全的List容器
  5. JavaScript-你不知道的JavaScript (免费分享)
  6. centos、linux离线搭建yum源,iso文件制作yum源,nginx搭建yum源
  7. 2018中科大计算机考研心得
  8. [转] 【开源访谈】Muduo 作者陈硕访谈实录
  9. Java学习网站 [摘自互联网]
  10. np.quantile()详解