先上java的闭包(利用Function和BiFunction实现)

Function

从Function的定义中可以看到,它其实是一个接口,可以接收一个泛型的输入参数,和一个泛型的返回参数,使用也很简单,可以看下面的demo

/*** @param num* @param function* @return* @desc 使用JDK8 Function函数*/
private Integer compute(Integer num, Function<Integer, Integer> function) {Integer result = function.apply(num);return result;
}

但是有时候一个参数不够用啊,怎么办呢,这个时候就可以用BiFunction了

String calculatePlus(Integer num1, Integer num2, BiFunction<Integer,Integer,String> biFunction){//这里按照声明的BiFunction<Integer,Integer,String> 传入2个Integer类型的形参,返回一个String类型的返回值String result = biFunction.apply(num1,num2);System.out.println("闭包的返回值"+result);return result.concat("Hello World");
}

经过上面2个demo,对于闭包的初步理解以及使用逐渐清晰了,但是只有一个闭包方法还是满足不了生产环境的,这个时候Function的嵌套闭包就可以出场了

使用compose函数,简单的说,就是从右向左处理

@Test
public void contextLoads() {    System.out.println(calculatePlusPlus(2,"加班啊",(value1) -> {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("我是function1 " + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) + " value = " + value1);return value1 + value1;}, (value2) -> {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("我是function2 " + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) + " value = " + value2);return String.valueOf(value2 + value2);}));}String calculatePlusPlus(Integer num1, String str1, Function<Integer,Integer> function1, Function<Integer,String> function2){//这里 function2 会把 function1 返回的 Integer 类型的返回值作为输入值,然后参与 function2 自己的闭包运算,后面的那个 apply(num1) 其实是function1的输入String function2Result = function2.compose(function1).apply(num1);/* //还能这里的执行顺序的从后往前的,先执行最后的 function1 再执行 倒数第二个 function1 最后执行 function2//为什么呢,主要是 compose 方法里先执行的传入的参数的 applyString function2Result = function2.compose(function1).compose(function1).apply(num1);*/System.out.println("闭包的返回值" + function2Result);return function2Result.concat(" Hello World");
}

输出的值

compose方法的定义

当然也可以使用andThen从左向右执行的

@Test
public void contextLoads() {System.out.println(calculatePlusPlusPlus(2,"加班啊",(value1) -> {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("我是function3 " + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) + " value = " + value1);return String.valueOf(value1 + value1);}, (value2) -> {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("我是function4 " + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) + " value = " + value2);return value2 + value2;}));}/*** andThen 从左向右执行* @param num1* @param str1* @param function3* @param function4* @return*/
String calculatePlusPlusPlus(Integer num1, String str1, Function<Integer,String> function3, Function<Integer,Integer> function4){//这里 function3 会把 function4 返回的 Integer 类型的返回值作为输入值,然后参与 function3 自己的闭包运算,后面的那个 apply(num1) 其实是 function4 的输入String function2Result = function4.andThen(function3).apply(num1);System.out.println("闭包的返回值" + function2Result);return function2Result.concat(" Hello World");
}

整体demo的代码

package com.felix.event;import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.function.BiFunction;
import java.util.function.Function;@SpringBootTest
public class EventApplicationTests {@Testpublic void contextLoads() {System.out.println(calculate(6,(value) ->{return value + value;}));System.out.println(calculatePlus(1,2,(value1,value2) -> {return String.valueOf(value1 * value2);}));System.out.println(calculatePlusPlus(2,"加班啊",(value1) -> {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("我是function1 " + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) + " value = " + value1);return value1 + value1;}, (value2) -> {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("我是function2 " + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) + " value = " + value2);return String.valueOf(value2 + value2);}));System.out.println(calculatePlusPlusPlus(2,"加班啊",(value1) -> {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("我是function3 " + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) + " value = " + value1);return String.valueOf(value1 + value1);}, (value2) -> {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("我是function4 " + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) + " value = " + value2);return value2 + value2;}));}/*** andThen 从左向右执行* @param num1* @param str1* @param function3* @param function4* @return*/String calculatePlusPlusPlus(Integer num1, String str1, Function<Integer,String> function3, Function<Integer,Integer> function4){//这里 function3 会把 function4 返回的 Integer 类型的返回值作为输入值,然后参与 function3 自己的闭包运算,后面的那个 apply(num1) 其实是 function4 的输入String function2Result = function4.andThen(function3).apply(num1);System.out.println("闭包的返回值" + function2Result);return function2Result.concat(" Hello World");}/*** compose 从右向左执行* @param num1* @param str1* @param function1* @param function2* @return*/String calculatePlusPlus(Integer num1, String str1, Function<Integer,Integer> function1, Function<Integer,String> function2){//这里 function2 会把 function1 返回的 Integer 类型的返回值作为输入值,然后参与 function2 自己的闭包运算,后面的那个 apply(num1) 其实是function1的输入String function2Result = function2.compose(function1).apply(num1);/* //还能这里的执行顺序的从后往前的,先执行最后的 function1 再执行 倒数第二个 function1 最后执行 function2//为什么呢,主要是 compose 方法里先执行的传入的参数的 applyString function2Result = function2.compose(function1).compose(function1).apply(num1);*/System.out.println("闭包的返回值" + function2Result);return function2Result.concat(" Hello World");}Integer calculate(Integer num, Function<Integer,Integer> function){//这里按照声明的Function<Integer,Integer> 传入1个 Integer 类型的形参,返回一个 Integer 类型的返回值Integer result = function.apply(num);System.out.println("闭包的返回值"+result);return result + result;}String calculatePlus(Integer num1, Integer num2, BiFunction<Integer,Integer,String> biFunction){//这里按照声明的BiFunction<Integer,Integer,String> 传入2个Integer类型的形参,返回一个String类型的返回值String result = biFunction.apply(num1,num2);System.out.println("闭包的返回值"+result);return result.concat("Hello World");}}

参考自大佬的博文
https://www.cnblogs.com/webor2006/p/8204591.html

java8中的闭包Function/BiFunction相关推荐

  1. Function接口 – Java8中java.util.function包下的函数式接口

    作者:   Mohamed Sanaulla  译者: 李璟(jlee381344197@gmail.com) 早先我写了一篇<函数式接口>,探讨了Java8中函数式接口的用法.如果你正在 ...

  2. 让你分分钟学会Javascript中的闭包

    Javascript中的闭包 前面的话: 闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它 ...

  3. java8中的lambda表达式实用详解

    java8中的lambda表达式实用详解 1. lambda简介 ​ Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中 ...

  4. java8中的Lamba表达式

    1.什么情况有下可以使用lamba 在函数式接口中可以使用 2.什么是函数式接口 只有一个抽象方法的接口称为函数式接口,同时将这个抽象方法称为函数描述符 3.java8中新增了哪些函数式接口 Pred ...

  5. java8中class怎么用_Java8中你可能不知道的一些地方之方法引用实战

    Java8 中引入方法引用新特性,用于简化应用对象方法的调用, 方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法. 方法引用提供了一种引用而不执行方法的方式,它需要由兼容的函数式接口构成的 ...

  6. Java基础之Java8中Map的compute的使用

    Java基础之Java8中Map的compute的使用 一.介绍 Java8更新后,Map接口中提供了compute方法.下面我们先看看官方文档的对它的使用说明. 如果看完上面的还是不太明白的话,看下 ...

  7. java8中 lambda表达式,stream操作

    什么是lambda表达式 概念:Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda ab ...

  8. Java8中Lambda表达式的10个例子

    Java8中Lambda表达式的10个例子  例1 用Lambda表达式实现Runnable接口 Java代码   //Before Java 8: new Thread(new Runnable() ...

  9. 初步学习JS中的闭包

    JS高级程序设计(3rd)中对闭包的定义就是一句话,首先闭包是一个函数,怎样的函数呢?有权访问另一个函数作用域中的变量 的函数.而创建闭包的常见方式就是在一个函数的内部创建另一个函数,就是嵌套函数. ...

  10. javascript中的闭包这一篇就够了

    什么是闭包 维基百科中的概念 在计算机科学中,闭包(也称词法闭包或函数闭包)是指一个函数或函数的引用,与一个引用环境绑定在一起,这个引用环境是一个存储该函数每个非局部变量(也叫自由变量)的表. 闭包, ...

最新文章

  1. JavaWeb项目第三次总结_成绩查询的实现
  2. zImage与uImage的区别
  3. python车牌识别逆光怎么办代码_这摄像头除了能逆光识别车牌,还会跟人打招呼?...
  4. android+udp传输大小,Android UDP数据包如何接收可变大小的数据包
  5. rsync软件配置和使用教程
  6. 虚拟服务器e,虚拟主机服务器E
  7. Python __dict__
  8. Docker服务安全加固
  9. libc.so.6被删后导致系统无法使用的原因及解决方法
  10. 【NOIP2016提高A组模拟9.14】数列编辑器
  11. 图像像素点赋值_OpenCV学习笔记(二)之图像阈值化
  12. python的spider如何让鼠标不_【专题教学】python wooyun爬虫模拟鼠标等
  13. 爬虫日记(23):用scrapy快速地爬取蜂鸟网图片
  14. QMainWindow界面添加标题栏
  15. 百度地图标注公司那家好
  16. 区间缩放,标准化,归一化
  17. NO7、斐波那契数列(easy不需再刷)
  18. 初次来到博客园进行交流学习还请大家多指教!
  19. 小陈学js 预解析
  20. 苹果电脑远程管理/屏幕共享的客方设置

热门文章

  1. python解析XML
  2. 有源蜂鸣器与无源蜂鸣器的驱动方式详解(精华版)
  3. 无视任何限制和权限 强制删除文件夹/文件
  4. MyEclipse 注册码
  5. 学习基于springboot的java分布式中间件-Redis(3) redis之缓存穿透等典型问题
  6. 【序列推荐】KDD2018|STAMP---基于注意力的短期记忆优先的推荐
  7. 计算机网络速度慢原因,导致电脑网速变慢的七大原因
  8. gateface php,XAMPP下载-Xampp(PHP环境套件)V8.01 官方win版-ucbug软件站
  9. xml文件转json文件
  10. 遥感式雷达监测水位流速设备