Java8的新特性之一,就是首次引入了函数式编程Lambda表达式,按oracle的说法,是为了引导java向函数式编程的方向发展。

在JDK1.8中,多了一个包,java.util.function,这里主要用到了这个包下面的两个接口:

要解释清楚这个问题,首先得从lambda表达式说起

(x,y)->doSomethingWith(x,y);

这句话就是一个lambda表达式的例子;"->"是Java8新定义的一个操作符,操作符左边代表lambda表达式接收的参数,这里它接收了两个参数,x和y;表达式右边是函数操作,也就是对这两个变量执行某种操作。如x+y,x*y等。

简单的解释了一下java8的lambda表达式,接下来进入正题:

在java8中,function包下面的所有接口都描述了一种预定义的lambda表达式类型,换句话说,就是可以通过声名接口类型的变量为lambda赋值,从而达到函数参数化的目的,这样说可能比较抽象,看代码

仔细体会上面的代码,函数adaper这里表示对字符串进行某种适配并将它打印出来,而具体的适配方式是通过参数传过来的,我们来看看运行结果:

和预期的完全一样,如果你能看懂上面的代码,我相信你已经基本明白了java8的函数式接口用法。

下面我针对上面提到的两个接口做一下解释:

所有的接口都是泛型定义的,泛型的作用在于类型推断,也就是说你指定了lambda的类型,那么他接收的参数的类型就是确定的,编译器就可以推断lambda的类型。事实上,在“->”运算符左边括号内的参数都是“匿名”的,你既无需考虑它们的引用,也无需事先声名它们,它们只在当前lambda表达式内作用,并且类型已经确定。再深入思考一点,如果你熟悉接口重载,你可能觉得这和泛型一样,是一块语法糖,事实上并非如此,Oracle为了引导java向函数式编程的方向发展,放弃了简单的接口重载,而是通过动态编译实现的。

再说说这两个接口的区别:

Consumer 中文译作“消费者”,它通过接口下的accept方法,接收唯一的参数,并执行操作;参数和调用该方法的上下文是无关的,也就是说对变量执行的操作不影响原上下文中的变量;

Function 接口则可以通过调用apply方法返回一个值,从而供之后调用。

要解释清楚这一问题,还得靠代码:

运行结果:

可见,Consumer并没有影响到它的上下文,它用的参数是变量的“副本”;而不是变量的指针。

接下来说说类似js中的callback();

对于一项功能,如果我们能够提供多个参数,我们倾向于使用函数或者方法来实现;但是如果我们需要用到多个参数,由于函数至多只有一个返回值,所以此时采用方法的思想我们需要多个函数或者方法,这时最简单的就是将方法传过去,而不用返回,类似的场景在JS中非常常见

jQuery Ajax方法中success场景下的data就是一个典型的callback,现在java也可以实现类似的效果,从而提高代码重用率

运行结果如下:

初来乍到,有错误还望批评指正。

java callback类_利用java8新特性实现类似javascript callback特性相关推荐

  1. java compiler类_利用 JavaCompiler 编译 Java 类文件

    1.[代码]DiagnosticCollectorCompile.java import java.io.IOException; import java.util.Arrays; import ja ...

  2. java stream byte_乐字节-Java8新特性之Stream流(上)

    上一篇文章,小乐给大家介绍了<Java8新特性之方法引用>,下面接下来小乐将会给大家介绍Java8新特性之Stream,称之为流,本篇文章为上半部分. 1.什么是流? Java Se中对于 ...

  3. 高级JAVA开发必备技能:java8 新日期时间API((一)JSR-310:ZoneId 时区和偏移量)(JAVA 小虚竹)

    技术活,该赏 点赞再看,养成习惯 大家好,我是小虚竹.之前有粉丝私聊我,问能不能把JAVA8 新的日期时间API(JSR-310)知识点梳理出来.答案是肯定的,谁让我宠粉呢.由于内容偏多(超十万字了) ...

  4. java path类_基于java Files类和Paths类的用法(详解)

    Java7中文件IO发生了很大的变化,专门引入了很多新的类: import java.nio.file.DirectoryStream; import java.nio.file.FileSystem ...

  5. java invoke 泛型_利用Java反射机制和泛型,全自动解析json

    有啦这个简直,太爽啦, 利用Java 反射机制,利用Class 就可以得到 类的 变量  Field[] fields=cls.getDeclaredFields(); 还可以通过类中 的方法名字 去 ...

  6. java lambda表达式_「JAVA8」- Lambda 表达式

    Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性. Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中). 使用 Lambda 表达式可以使代码变的更加 ...

  7. 什么是java工具类_常用高效 Java 工具类总结

    一.前言 在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法按使用流行度排名,参考数据来源于Github上随机选取的5万个开源项目源码 ...

  8. java object类_快速上手 Kotlin 开发系列之与 Java 互调 (1)

    学习完基础语法之后,我们来学习下 Java 和 Kotlin 互相调用的问题 本节将介绍 Kotlin 与 Java 之间的语法变化 Kotlin 文件中的函数 首先让大家感到非常不适应的一点是,Ko ...

  9. java compare 返回值_关于Java你不知道的那些事之Java8新特性[Lambda表达式和函数式接口]...

    前言 为什么要用Lambda表达式? Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码,将代码像数据一样传递,这样可以写出更简洁.更灵活的代码,作为一个更紧凑的代码风 ...

最新文章

  1. 如何利用图像预处理提高OCR的准确性?
  2. 互联网天生本质与产业大局的开始
  3. 【转】Itween 贝塞尔曲线(一)
  4. 气泡形提示控件grumble.js
  5. 以源码编译的方式安装PHP与php-fpm
  6. 上传的镜像无法用来启动云主机
  7. GitHub清除commit记录
  8. 爱的世界很拥挤,写在读《爱,就这么简单》之后
  9. nginx源码分析—数组结构ngx_array_t
  10. 那些你从未见过的神奇物理化学实验,今天全给你整理了!
  11. Android学习笔记:TabHost 和 FragmentTabHost(转)
  12. 电子书包“翻转”课堂
  13. 去重 list_List 去除重复数据的 5 种正确姿势!
  14. IIS写入漏洞利用工具解析
  15. 20191122 视频版控制台上的极乐净土
  16. Linux输入密码后一直在登陆界面循环
  17. 《java程序员面试笔试宝典》学习笔记
  18. [Python] 央视新闻联播推送
  19. 今晚开启公募的雪崩协议,带协议层先进入3.0
  20. 团购网站出路 艰难转型

热门文章

  1. Java注解是如何工作的?
  2. 一个学渣三次面试阿里之路
  3. 缓存穿透、缓存并发、热点缓存之最佳招式
  4. 怎样用vc 做一个c语言,大佬们,小菜鸟想问一问用vc编译器做简易画图软件
  5. wpf中内容包含在border中_WPF:点击后聚焦边框(WPF: Focus border after click)
  6. hk.module must be initialized inside an hk.transform
  7. KNN、MOG2和GMG
  8. flask 与layui冲突
  9. Python操作ElasticSearch
  10. 幂函数与指数函数的区别