Java lambda 表达式详解(JDK 8 新特性)
什么是 lambda 表达式
lambda 表达式(拉姆达表达式)是 JAVA 8 中提供的一种新的特性,它使 Java 也能进行简单的“函数式编程”。
lambda 表达式的本质就是一个匿名方法(即没有方法名的方法)
lambda 表达式使用案例
- 使用 lambda 表达式实现 Runnable
package com.lambda;
/**
* 使用lambda表达式替换Runnable匿名内部类
* @author MingChenchen
*
*/
public class RunableTest {
/**
* 普通的 Runnable
*/
public static void runSomeThing(){
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("I am running");
}
};
new Thread(runnable).start();
}
/**
* 使用lambda后的
*/
public static void runSomeThingByLambda(){
new Thread(() -> System.out.println("I am running")).start();
}
public static void main(String[] args) {
runSomeThing();
// runSomeThingByLambda();
}
}
上述代码中 () -> System.out.println("I am running")就是一个lambda表达式,可以看出,它是替代了new Runnable(){}这个匿名内部类。
- 使用 lambda表达式 实现 Comparator
package com.lambda;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class SortList {
//给入一个List
private static List<String> list =
Arrays.asList("my","name","is","uber","and","uc");
/**
* 对一个String的list进行排序 - 使用老方法
*/
public static void oldSort(){
//排序
Collections.sort(list,new Comparator<String>() {
//使用新的排序规则 根据第二个字符进行逆序排
@Override
public int compare(String a,String b){
if (a.charAt(1) <= b.charAt(1)) {
return 1;
}else{
return -1;
}
}
});
}
/**
* 新的排序方法 - 使用lambda表达式实现
*/
public static void newSort(){
//lambda会自动推断出 a,b 的类型
Collections.sort(list, (a, b) -> a.charAt(1) < b.charAt(1) ? 1:-1);
}
public static void main(String[] args) {
// oldSort();
newSort();
}
}
- 使用 lambda 表达式实现 ActionListener
package com.lambda;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
public class ActionEventDemo {
private JButton button = new JButton();
public void bindEvent(){
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("你好!" );
}
});
}
/**
* 使用Lambda表达式 为button添加ActionListener
*/
public void bindEventByLambda(){
button.addActionListener(e -> System.out.println("你好!"));
}
}
lambda 表达式的由来
通过上述的几个例子,大家差不多也能明白了 lambda 表达式是用来干什么以及好处了。
显而易见的,好处就是代码量大大减少了!程序逻辑也很清晰明了。
它的用处浅显来说就是替代“内部匿名类”、可以对集合或者数组进行循环操作。
因此,JDK 8 中就提供了这种 lambda 表达式,供我们来更加简明扼要的实现内部匿名类的功能。
何时使用 lambda 表达式
lambda 表达式的本质是一个匿名方法,那就是说当你只需要一个能做一件事情的方法而已,连方法叫什么名字都无关紧要,Lambda 表达式就可以用来做这件事。
lambda 表达式语法
基本语法:
(参数) -> 表达式
或
(参数) -> { 代码块; }
//1. 接收2个int型整数,返回他们的和
(int x, int y) -> x + y;
//2. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
(String s) -> System.out.print(s);
lambda 表达式特性
类型推导
编译器负责推导lambda表达式的类型。它利用lambda表达式所在上下文所期待的类型进行推导,
这个被期待的类型被称为目标类型。就是说我们传入的参数可以无需写类型了!
变量捕获
在Java SE 7中,编译器对内部类中引用的外部变量(即捕获的变量)要求非常严格:
如果捕获的变量没有被声明为final就会产生一个编译错误。
我们现在放宽了这个限制——对于lambda表达式和内部类,
我们允许在其中捕获那些符合有效只读(Effectively final)的局部变量。
简单的说,如果一个局部变量在初始化后从未被修改过,那么它就符合有效只读的要求,
换句话说,加上final后也不会导致编译错误的局部变量就是有效只读变量。
注意:此处和final关键字一样,指的是引用不可改!(感觉没多大意义,还不是用的final)
方法引用
如果我们想要调用的方法拥有一个名字,我们就可以通过它的名字直接调用它。
Comparator byName = Comparator.comparing(Person::getName);
此处无需再传入参数,lambda会自动装配成Person类型进来然后执行getName()方法,而后返回getName()的String
方法引用有很多种,它们的语法如下:
静态方法引用:ClassName::methodName
实例上的实例方法引用:instanceReference::methodName
超类上的实例方法引用:super::methodName
类型上的实例方法引用:ClassName::methodName
构造方法引用:Class::new
数组构造方法引用:TypeName[]::new
JAVA提供给我们的SAM接口
Java SE 8中增加了一个新的包:java.util.function,它里面包含了常用的函数式接口,例如:
Predicate——接收T对象并返回boolean
Consumer——接收T对象,不返回值
Function<T, R>——接收T对象,返回R对象
Supplier——提供T对象(例如工厂),不接收值
UnaryOperator——接收T对象,返回T对象
BinaryOperator——接收两个T对象,返回T对象
那么在参数为这些接口的地方,我们就可以直接使用 lambda 表达式了!
lambda 表达式优缺点
优点
- 极大的简化代码,去除了很多无用的 Java 代码,使得代码更为简洁明了
缺点
- 可读性差。在代码简洁的情况下,另一方面又让大多程序员很难读懂。因为很少程序员接触使用它。 (不过这个缺点不是本身缺点,而且源于程序员较少使用)
总结
lambda 表达式是 JDK 8 新特性,本质是一个匿名方法,可以简化代码,但代码可读性差。
Java lambda 表达式详解(JDK 8 新特性)的更多相关文章
- Java 8 Lambda 表达式详解
一.Java 8 Lambda 表达式了解 参考:Java 8 Lambda 表达式 | 菜鸟教程 1.1 介绍: Lambda 表达式,也可称为闭包,是推动 Java 8 发布的最重要新特性. La ...
- JAVA8之lambda表达式详解
原文:http://blog.csdn.net/jinzhencs/article/details/50748202 lambda表达式详解 一.问题 1.什么是lambda表达式? 2.lambda ...
- Java8 Lambda表达式详解手册及实例
先贩卖一下焦虑,Java8发于2014年3月18日,距离现在已经快6年了,如果你对Java8的新特性还没有应用,甚至还一无所知,那你真得关注公众号"程序新视界",好好系列的学习一下 ...
- Lambda表达式详解(例子详解)(转自:http://blog.csdn.net/damon316/article/details/51734661)
Lambda表达式详解(例子详解) lambda简介 lambda运算符:所有的lambda表达式都是用新的lambda运算符 " => ",可以叫他,“转到”或者 ...
- 类型:.net;问题:C#lambda表达式;结果:Lambda表达式详解
Lambda表达式详解 前言 1.天真热,程序员活着不易,星期天,也要顶着火辣辣的太阳,总结这些东西. 2.夸夸lambda吧:简化了匿名委托的使用,让你让代码更加简洁,优雅.据说它是微软自c#1 ...
- Java中lambda表达式详解
原文地址:http://blog.laofu.online/2018/04/20/java-lambda/ 为什么使用lambda 在java中我们很容易将一个变量赋值,比如int a =0;int ...
- Lambda表达式详解
前言 1.天真热,程序员活着不易,星期天,也要顶着火辣辣的太阳,总结这些东西. 2.夸夸lambda吧:简化了匿名委托的使用,让你让代码更加简洁,优雅.据说它是微软自c#1.0后新增的最重要的功能之一 ...
- Lambda表达式详解(转载)
原文链接:http://www.cnblogs.com/knowledgesea/p/3163725.html lambda简介 lambda运算符:所有的lambda表达式都是用新的lambda运算 ...
- (转)Lambda表达式详解
本文转载自:http://www.cnblogs.com/knowledgesea/p/3163725.html 前言 1.天真热,程序员活着不易,星期天,也要顶着火辣辣的太阳,总结这些东西. 2.夸 ...
随机推荐
- 02 . MongoDB复制集,分片集,备份与恢复
复制集 MongoDB复制集RS(ReplicationSet): 基本构成是1主2从的结构,自带互相监控投票机制(Raft(MongoDB)Paxos(mysql MGR 用的是变种)) 如果发生主 ...
- 会议更流畅,表情更生动!视频生成编码 VS 国际最新 VVC 标准
阿里云视频云的标准与实现团队与香港城市大学联合开发了基于 AI 生成的人脸视频压缩体系,相比于 VVC 标准,两者质量相当时可以取得 40%-65% 的码率节省,旨在用最前沿的技术,普惠视频通话.视频 ...
- TypeScript在React项目中的使用总结
序言 本文会侧重于TypeScript(以下简称TS)在项目中与React的结合使用情况,而非TS的基本概念.关于TS的类型查看可以使用在线TS工具TypeScript游乐场 React元素相关 Re ...
- (七)docker-compose 安装
一.Docker-Compose简介 Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排. Docker-Compose将所管理的容器分为三层,分别 ...
- ASP微信服务号H5客户登陆,且获取客户授权的用户基本信息
ASP微信服务号H5客户登陆,且获取客户授权的用户基本信息是需要客户授权,下面讲解详细步骤: 第一步:客户点击登录页,自动跳转到微信服务器端获取code 第二步:用第一步获取的code去获取客户的ac ...
- Vue method与computed的区别
为了说明method与computed的区别,在此我想先来看看computed属性在vue官网中的说法: 模板内的表达式是非常便利的,但是它们实际上只用于简单的运算.在模板中放入太多的逻辑会让模板过重 ...
- php自定义配置文件简单写法
1 <?php 2 header("Content-type:text/html;charset=utf-8"); 3 4 $q = getconfig('rr'); 5 e ...
- sublimeText常用插件
扩展包: EmmetAlignmentDocBlockrSideBarEnhancementsFileDiffsColorsublimelocalizationAutoFileNameA File ...
- 解决在Vim中鼠标右键不能粘贴问题
最近维护一台服务器,使用putty登录后,用vim时,鼠标右键不能 粘贴而是进入了visual模式.网上查找一番找到了解决方法: 方 法一:在普通模式下键入" :set mouse-=a&q ...
- Intel汇编语言程序设计学习-第二章 IA-32处理器体系结构-下
2.2 IA-32处理器体系结构 如前所述,IA-32是指始于Intel386直到当前最新的奔腾4的系列的处理器(额...这本书是什么时候写的啊,表示现在应该是I7啊),在IA-32的发展过程中,I ...