Java 8新增的Lambda表达式
一. 表达式入门
Lambda表达式支持将代码块作为方法参数,lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(这种接口被称为函数式接口)的实例,相当于一个匿名的方法。
1.1 Lambda表达式入门
Lambda表达式由三部分组成:
- 形参列表。形参列表允许省略形参类型,如果只有一个参数,那么形参列表的圆括号也可以删除。
- 箭头(->)。
- 代码块。Lambda表达式需要返回值,如果Lambda表达式代码块只有一条返回语句,则可以省略return关键字和包裹这条语句的花括号,表达式自动返回这条语句。
Lambda表达式作为参数使用时,相当于一个任何类型的对象。
1.2 Lambda表达式与函数式接口
Lambda 表达式的类型,也被称为“目标类型”,Lambda表达式的目标类型必须是函数式接口。
函数式接口代表只包含一个抽象方法的接口,可以包含多个默认方法,静态方法,但只能声明一个抽象方法。
由于Lambda表达式的结果就是被当成对象,因此程序完全可以使用Lambda表达式进行赋值。例如
Runnable r = ()->{
for( int i =0;i <100;i++)
{
System.out.println();
}
};
1.3 Lambda的使用方式
- 将Lambda表达式赋值给函数式接口类型变量
- 将Lambda表达式作为函数式接口类型的参数传给某个方法
- 使用函数时接口对Lambda表达式进行强制类型转换。
例如上面代码可改成
Object obj =(Runnable) ()->{
for( int i =0;i <100;i++)
{
System.out.println();
}
};
Java8在java.util.function包下定义了大量函数式接口,典型的有四类
- XxxFunction。apply()抽象方法对参数进行处理转换,然后返回一个新的值。
- XxxConsumer。accept()抽象方法也是对参数进行转换处理,不返回处理结果。
- XxxxPredicate。test()抽象方法对参数进行判断,返回一个boolean值。
- XxxSupplier。getAsXxx()抽象方法没有参数,会按某种逻辑算法返回一个数据。
1.4 方法引用与构造器引用
如果Lambda表达式代码块只有一条代码,还可以在代码块中使用方法引用和构造器引用
| 种类 | 实例 | 说明 | 对应的Lambda表达式 |
| 引用类方法 | 类名::类方法 | 函数式接口被实现方法的参数传给该类方法作为参数 | (a,b,...)->类名.类方法(a,b,...) |
| 引用特定对象的类方法 | 特定对象::实例方法 | 函数式接口被实现方法的参数传给该方法作为参数 | (a,b,...)->特定对象.实例方法(a,b,...) |
| 引用某类对象的实例方法 | 类名::实例方法 | 函数式接口中被实现方法的第一个参数作为调用者,后面的参数全部传给该方法作为参数 | (a,b,...)->a.实例方法(a,b,...) |
| 引用构造器 | 类名::new | 函数式接口被实现方法的参数传给该构造器作为参数 | (a,b,...)->new 类名(a,b,...) |
例如实例引用类方法
interface Converter{
Integer convert(String s);
}
//下面代码使用Lambda表达式创建Converter对象
Converter converter1 = from -> Integer.valueOf(from);
上面代码符合方法引用的条件,可以用下面的代码替换
Converter converter1 = Integer::valueOf;
其他类型的方法引用大同小异,由于篇幅,不在多做介绍
Java 8新增的Lambda表达式的更多相关文章
- Java 8:掌握 Lambda 表达式
本文将介绍 Java 8 新增的 Lambda 表达式,包括 Lambda 表达式的常见用法以及方法引用的用法,并对 Lambda 表达式的原理进行分析,最后对 Lambda 表达式的优缺点进行一个总 ...
- Java核心技术-接口、lambda表达式与内部类
本章将主要介绍: 接口技术:主要用来描述类具有什么功能,而并不给出每个功能的具体实现.一个类可以实现一个或多个接口. lambda表达式:这是一种表示可以在将来的某个时间点执行的代码块的简洁方法. 内 ...
- Java疯狂讲义笔记——Lambda表达式
Java8新增的Lambda表达式 [特性]支持将代码块作为方法参数,Lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(这种接口被称为函数式接口)的实例. [组成部分]1,形参列表 ...
- Java函数式编程和lambda表达式
为什么要使用函数式编程 函数式编程更多时候是一种编程的思维方式,是种方法论.函数式与命令式编程的区别主要在于:函数式编程是告诉代码你要做什么,而命令式编程则是告诉代码要怎么做.说白了,函数式编程是基于 ...
- Java基础教程:Lambda表达式
Java基础教程:Lambda表达式 本文部分内容引用自OneAPM:http://blog.oneapm.com/apm-tech/226.html 引入Lambda Java 是一流的面向对象语言 ...
- java函数式编程之lambda表达式
作为比较老牌的面向对象的编程语言java,在对函数式编程的支持上一直不温不火. 认为面向对象式编程就应该纯粹的面向对象,于是经常看到这样的写法:如果你想写一个方法,那么就必须把它放到一个类里面,然后n ...
- 最全最强 Java 8 - 函数编程(lambda表达式)
Java 8 - 函数编程(lambda表达式) 我们关心的是如何写出好代码,而不是符合函数编程风格的代码. @pdai Java 8 - 函数编程(lambda表达式) 简介 lambda表达式 分 ...
- 【Java】Java8新增的Lambda表达式_学习笔记
一.Lambda表达式可以简化创建匿名内部类对象 1.不需要new XXX(){}这种繁琐代码. 2.不需要指出重写的方法名. 3.不要给出重写的方法的返回值类型. 4.Lambda相当于一个匿名方法 ...
- Java 函数式编程和Lambda表达式
1.Java 8最重要的新特性 Lambda表达式.接口改进(默认方法)和批数据处理. 2.函数式编程 本质上来说,编程关注两个维度:数据和数据上的操作. 面向对象的编程泛型强调让操作围绕数据,这样可 ...
随机推荐
- mysql中如何修改表的名字?修改表名?
需求描述: 今天在进行mysql表的历史数据迁移,需要将某张表进行备份,修改表的名字,在此记录下操作过程. 操作过程: mysql> create table ts01 like ti_o_sm ...
- [Bayes] What is Sampling
Ref: http://blog.csdn.net/xianlingmao/article/details/7768833 通常,我们会遇到很多问题无法用分析的方法来求得精确解,例如由于式子特别,真的 ...
- IIS------项目配置到IIS后报500错误
转载: http://blog.csdn.net/yinjingjing198808/article/details/7185453 错误一: HTTP Error 500.19 - Internal ...
- 【能力提升】SQL Server常见问题介绍及高速解决建议
前言 本文旨在帮助SQL Server数据库的使用人员了解常见的问题.及高速解决这些问题.这些问题是数据库的常规管理问题,对于非常多对数据库没有深入了解的朋友提供一个大概的常见问题框架. 以下一些问题 ...
- Hibernate_day04讲义_使用Hibernate完成对客户的条件查询
- backbone学习笔记:集合(Collection)
集合(Collection)是一个Backbone对象,用来组织和管理多个模型,它不仅仅是一个javascript数组,还提供了专门的方法来对集合进行排序.过滤和遍历,集合可以方便的与REST服务器进 ...
- Docker应用之容器
容器是独立运行的一个或一组应用,以及他们的运行态环境 1.启动容器(基于镜像新建一个容器并启动或将终止状态的容器重新启动) run后面添加--name参数可以指定容器的名称,否则系统默认会给名称:使用 ...
- linux系统如何操作隐藏文件
在linux下,以点"."开头命名的文件在系统中被视为隐藏文件.因此,如果想隐藏某个文件或目录,一种简单的办法就是把文件名命名为点开头. 对于目录backcron,可以这样操作隐藏 ...
- N76E003的学习之路(ADC简单小例程篇)
N76E003内嵌12位逐次逼近寄存器型(SAR)的模拟数字转换器(ADC).模数转换模块负责将管脚上的模拟信号转换为12位二进制数据.N76E003支持8通道单端输入模式.内部带隙电压(band-g ...
- 通过java的i/o机制进行图片流的存储以及对网络图片的存储
存储内地图片思路:首先把原有的图片以流的方式读取出来,再以流的方式存储到目标文件: package imgStream; import java.io.*; public class ImgStrea ...