在上一篇【http://www.cnblogs.com/webor2006/p/7707281.html】中提到了方法推导的东东:

这里说细的学习一下它,下面走起!

Method references【方法推导】:

编译运行:

而对于上面的代码可以用Lambda更加精简:

不多解释,然后对于上面的代码还能进一步精简,这时就得用到Lambda的方法推导啦,如下:

可以打一下println()的方法源码:

而方法推导的使用方式就是类后面加两个":",再跟上要调用的方法名。

其实在JAVA8 IN ACTION中就有一节专门介绍方法推断的,其中描述了在下列三种情况下可以改用方法推断,如下:

1. A method reference to a static method (for example, the method parseInt of Integer, written Integer::parseInt) 

上面已经说明了这种情况,比如Integer.parseInf()方法是静态的,平常我们也大量会使用到它,这时它就可以用方法推荐的方式编写,具体如下:

2. A method reference to an instance method of an arbitrary type (for example, the method length of a String, written String::length) 

一个对象的方法也可以用推导,如描述中所举例的String对象的length方法,这里用它的另外一个方法来举例,charAt:

其结果输出是一样的:

【注】:这里是用的String::charAt,也就是用的String的类,而非类的实例,它跟第三点有点不一样。

3. A method reference to an instance method of an existing object (for example, suppose you have a local variable expensiveTransaction that holds an object of type Transaction, which supports an instance method getValue; you can write expensiveTransaction::getValue) 

还是以上面String的charAt为例,以实例的方式如下:

Constructor references【构造函数方法推导】:

在上节中提到的String::new的推导也就是属于这种,也就是对像的实例可以用推导的方式来写,再来复习下:

上面这个是调用无参的构造函数,但如果存在二个构造参数如何用推导的方式呢,这里还是以之前咱们写的Apple为例:

那如果构造存在三个参数怎么办呢?系统的Function貌似也就最多支持二个输入参,这时咱们可以自己手写Function,这里先来定义一个三个参数的Apple实体:

这时定义咱们自己的Function,如下:

接着来实例化三个参数的Apple如下:

下面再来看另外一个例子:

编译运行:

其实对于数组的排序还有另外一种更加简便的写法,其中也涉及到了方法的推导,如下:

查看一下Comparator.comparing()的源码理解一下它的原理:

而传的Apple::getColor返回的:

所以keyExtractor.apply(c1=Apple)就刚好返回的是c1的color,所以上面可以等于(c1, c2) -> c1.color.compareTo(c2.color),其实也就是等价于这种方式:

对于这个源码有个大概的印象,以便可以知其所有然。

对于对集合进行排序可以把目前的三种写法列出来直观感受一下:

是不是推出的新的写法就是为了让代码更加的精简呢~~至此对于Java8的Lambda表达式相关的东东就学得差不多了,需好好消化。

Lambda方法推导(method references)的更多相关文章

  1. Atitit java方法引用(Method References) 与c#委托与脚本语言js的函数指针

    Atitit java方法引用(Method References) 与c#委托与脚本语言js的函数指针   1.1. java方法引用(Method References) 与c#委托与脚本语言js ...

  2. JAVA 8 方法引用 - Method References

    什么是方法引用 简单地说,就是一个Lambda表达式.在Java 8中,我们会使用Lambda表达式创建匿名方法,但是有时候,我们的Lambda表达式可能仅仅调用一个已存在的方法,而不做任何其它事,对 ...

  3. Java 8Lambda之方法引用(Method References)

    方法引用分为4类,方法引用也受到访问控制权限的限制,可以通过在引用位置是否能够调用被引用方法来判断.具体分类信息如下: 类型 使用方式 静态方法 ContainingClass::staticMeth ...

  4. 方法引用(Method References)

    * 方法引用的使用 * * 1.使用情境:当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用! * * 2.方法引用,本质上就是Lambda表达式,而Lambda表达式作为函数式接口 ...

  5. Lambda语言篇 —— lambda, 方法引用, 目标类型和默认方法

    本文介绍了Java SE 8中新引入的lambda语言特性以及这些特性背后的设计思想.这些特性包括: lambda表达式(又被成为"闭包"或"匿名方法") 方法 ...

  6. 深入学习Java8 Lambda (default method, lambda, function reference, java.util.function 包)

    Java 8 Lambda .MethodReference.function包 多年前,学校讲述C#时,就已经知道有Lambda,也惊喜于它的方便,将函数式编程方式和面向对象式编程基于一身.此外在使 ...

  7. 在Android项目中启用Java 8的部分特性--Lambda & Method References

    Android N发布时同时发布了一个新的编译工具Jack(AS2.1+支持),基于Jack我们可以使用Java 8 的部分特性,在低版本机器上能使用的更少,同时Jack也有诸多不完善,工具链的改变难 ...

  8. ASP.NET MVC 5 - 验证编辑方法(Edit method)和编辑视图(Edit view)

    在本节中,您将验证电影控制器生成的编辑方法(Edit action methods)和视图.但是首先将修改点代码,使得发布日期属性(ReleaseDate)看上去更好.打开Models \ Movie ...

  9. 验证编辑方法(Edit method)和编辑视图(Edit view)

    ASP.NET MVC 5 - 验证编辑方法(Edit method)和编辑视图(Edit view) 在本节中,您将验证电影控制器生成的编辑方法(Edit action methods)和视图.但是 ...

随机推荐

  1. JAVA_day1_变量和常量

    JAVA变量和常量 一.JAVA中的关键字 注:关键字区分大小写,Try不是关键字而try则是. 二.JAVA标识符 1.标识符:标识符就是用于给 Java 程序中变量.类.方法等命名的符号. 2.标 ...

  2. Buffer与Cache的理解

    Linux与Windows内存Linux系统的内存机制是优先使用物理内存,当物理内存还有空闲时,Linux系统是不会释放内存的,即使使用过内存的程序已经被关闭,这部分内存就用来做缓存了.换句话说,即使 ...

  3. 云计算openstack核心组件--glance-镜像服务(6)

    glance做什么 OpenStack 由 Glance 提供 Image 服务 获取镜像位置 https://docs.openstack.org/image-guide/obtain-images ...

  4. 深入理解C语言-函数指针

    函数指针在C++中有着重要的应用,函数的函数名其本质就是代表一个地址,这个地址叫做函数入口,得到这个地址就可以对这个函数进行各种操作. 函数类型基础 函数三要素: 名称.参数.返回值 C语言中的函数有 ...

  5. Anaconda Spyder 常用快捷键

    Ctrl+1 注释.取消注释 Ctrl+4/5 块注释 / 取消块注释 Ctrl+D 删除一行 Ctrl+L 转到行 Ctrl+G/左键 查找函数定义 F9 运行选中代码 F12 断点 / 取消断点 ...

  6. [转帖]SSH原理与运用(一):远程登录

    http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html 写的很好.. 自己才简单明白了一点东西.. SSH是每一台Linux电脑的标准 ...

  7. STL set 常见用法详解

    <算法笔记>学习笔记 set 常见用法详解 set是一个内部自动有序且不含重复元素的容器 1. set 的定义 //单独定义一个set set<typename> name: ...

  8. python私有化xx、_xx、__xx、__xx__、xx_的区别

    xx:共有变量. _xx:私有化的属性或方法,from xxx import * 时无法导入,子类的对象和子类可以访问. __xx:避免与子类中的属性命名冲突,无法在外部直接访问(名字重整所以访问不到 ...

  9. javascript——== 和===的区别

    == 等于 === 全等(值和类型) console.log(5==5);//true console.log(5=="5");//true console.log(5===5); ...

  10. mvc布局(一)

    negut添加Optimization @System.Web.Optimization.Styles.Render( "~/Content/styles/css/font-awesome. ...