Java8新特性——Lambda 表达式
Lambda 表达式
Lambda 表达式的实质属于函数式编程。
语法格式为:(parameters) -> expression
或(parameters) ->{statements; }
Lambda 表达式的特点
- Lambda 表达式只能引用标记了 final 的外层局部变量
- 不能在lambda 内部修改定义在域外的局部变量
- Lambda 表达式的局部变量可以不用声明为 final,但是必须不可被后面的代码修改(自带 final)
- Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量
Lambda 表达式的作用
- 避免匿名内部类定义过多
- 让代码更简洁,只留下核心逻辑
函数式接口
函数式接口 Functional Interface,是只包含唯一一个抽象方法的接口。对于函数式接口,可以通过 Lambda 表达式来直接创建该接口的对象。如 Runnable 接口:
public interface Runnable {
public abstract void run();
}
使用 Lambda 表达式实现 Runnable
//常规写法
new Thread(new Runnable(){
@Override
public void run(){
...
}
}).start();
//Lambda 表达式
new Thread( () -> {
...
}).start();
JDK 1.8之前已有的函数式接口:
- java.lang.Runnable
- java.util.concurrent.Callable
- java.security.PrivilegedAction
- java.util.Comparator
- java.io.FileFilter
- java.nio.file.PathMatcher
- java.lang.reflect.InvocationHandler
- java.beans.PropertyChangeListener
- java.awt.event.ActionListener
- javax.swing.event.ChangeListener
JDK 1.8 新增加的函数接口:
- java.util.function
Lambda 表达式的简化过程
实现类-->静态内部类-->局部内部类-->匿名内部类-->Lambda 表达式
简化过程如下:
实现类
public class TestLamda01 {
public static void main(String[] args) {
DoSports jog = new Jog();
}
}
interface DoSports{
void start();
}
//实现类
class Jog1 implements DoSports{
@Override
public void start() {
System.out.println("I'm jogging");
}
}
静态内部类
public class TestLambda01 {
//静态内部类
static class Jog implements DoSports{
public void start(){
System.out.println("I'm jogging");
}
}
public static void main(String[] args) {
DoSports jog = new Jog();
jog.start();
}
}
interface DoSports{
void start();
}
局部内部类
public class TestLambda01 {
public static void main(String[] args) {
//局部内部类
class Jog implements DoSports{
public void start(){
System.out.println("I'm jogging");
}
}
DoSports jog = new Jog();
jog.start();
}
}
interface DoSports{
void start();
}
匿名内部类
public class TestLambda01 {
public static void main(String[] args) {
DoSports jog = new DoSports(){
public void start(){
System.out.println("I'm jogging");
}
};
jog.start();
}
}
interface DoSports{
void start();
}
Lambda 表达式
public class TestLambda01 {
public static void main(String[] args) {
DoSports jog = ()->{
System.out.println("I'm jogging"); //start() 方法执行主体
};
jog.start();
}
}
interface DoSports{
void start();
}
含参数的 Lambda 表达式简化
当只有一个参数时,可简化参数类型和括号
public class TestLambda01 {
public static void main(String[] args) {
/*可简化参数类型和括号
DoSports jog = (int a)->{
...
};*/
DoSports jog = a->{
//start() 方法执行主体
...
};
jog.start(参数1);
}
}
interface DoSports{
void start(int a);
}
当有多个参数时,可简化参数类型,必须加括号
public class TestLambda01 {
public static void main(String[] args) {
/*可简化参数类型和括号
DoSports jog = (int a,String b)->{
...
};*/
DoSports jog = (a,b)->{
//start() 方法执行主体
...
};
jog.start(参数1,参数2);
}
}
interface DoSports{
void start(int a,String b);
}
Java8新特性——Lambda 表达式的更多相关文章
- Java8新特性-Lambda表达式是什么?
目录 前言 匿名内部类 函数式接口 和 Lambda表达式语法 实现函数式接口并使用Lambda表达式: 所以Lambda表达式是什么? 实战应用 总结 前言 Java8新特性-Lambda表达式,好 ...
- 乐字节-Java8新特性-Lambda表达式
上一篇文章我们了解了Java8新特性-接口默认方法,接下来我们聊一聊Java8新特性之Lambda表达式. Lambda表达式(也称为闭包),它允许我们将函数当成参数传递给某个方法,或者把代码本身当作 ...
- java8新特性——Lambda表达式
上文中简单介绍了一下java8得一些新特性,与优点,也是为本次学习java8新特性制定一个学习的方向,后面几篇会根据上文中得新特性一一展开学习.本文就从java8新特性中比较重要的Lambda表达式开 ...
- Java8新特性 - Lambda表达式 - 基本知识
A lambda expression is an unnamed block of code (or an unnamed function) with a list of formal param ...
- java8新特性-lambda表达式和stream API的简单使用
一.为什么使用lambda Lambda 是一个 匿名函数,我们可以把 Lambda表达式理解为是 一段可以传递的代码(将代码像数据一样进行传递).可以写出更简洁.更灵活的代码.作为一种更紧凑的代码风 ...
- Java8新特性: lambda 表达式介绍
一.lambda 表达式介绍 lambda 表达式是 Java 8 的一个新特性,可以取代大部分的匿名内部类,简化了匿名委托的使用,让你让代码更加简洁,优雅. 比较官方的定义是这样的: lambda ...
- Java8 新特性lambda表达式(一)初始
本篇参考Richard Warburton的 java8 Lambdas :Functional Programming for the Masses 学习lambda表达式之前,需要知道什么是函数式 ...
- Java8新特性-Lambda表达式
1. 什么是Lambda表达式? Lambda表达式就是可以把函数作为参数传递,或者说把代码作为数据传递给函数. 2. Lambda表达式的语法格式 基本语法格式如下: 基本语法下多个变体的说明: ...
- Java8新特性——lambda表达式.(案例:词频统计)
需求:读入一个文本文件,确定所有单词的使用频率并从高到低排序,打印出所有单词及其频率的排序列表 先用传统方法解: package cn._1.wordfrequency; import java.ut ...
随机推荐
- Mybatis映射器(一)
XML查询参数: parameterType:可以给出类别名,全名等. resultType:查询结果,可以为 int,float,map等不可以与resultMap同时使用. resultMap: ...
- promise例题
let promise = new Promise(resolve => { console.log('Promise'); resolve(); }); promise.then(functi ...
- HTTP系列之:HTTP中的cookies
目录 简介 cookies的作用 创建cookies cookies的生存时间 cookies的权限控制 第三方cookies 总结 简介 如果小伙伴最近有访问国外的一些标准网站的话,可能经常会弹出一 ...
- C语言编译步骤
C语言编译步骤: 1.预处理(hello.i ):宏定义展开.条件编译等,同是将代码中的注释删除,这里并不会检查语法 2.编译(hello.s):检查语法,将预处理后文件编译生成汇编文件. 3.汇 ...
- Session原理、生命周期及购物车功能的实现
在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下).因此,在需要保存用户数据(保存该浏览器(会话)的相关信息)时 ...
- 从kratos分析breaker熔断器源码实现
为什么要用熔断 前面我们讲过限流保证服务的可用性,不被突如其来的流量打爆.但是两种情况是限流解决不了的. 如果我们服务只能处理1000QPS,但是有10wQPS打过来,服务还是会炸.因为拒绝请求也需要 ...
- Mac超好用的软件合集和系统设置
软件篇 这些软件好像只有动态壁纸是收费的. 推荐的都是特别小巧,更加专注特定功能,没那么多花里胡哨.当然你们有什么更好用的也可以推荐. 简单,好用才是我最喜欢的. Bob Github开源,Bob 是 ...
- MySQL——获取元数据
---------------------------------------------------------------------------------------------------- ...
- 20201219 u,v,w
开考前刚起床,所以一边考一边吃饭,然后整场都很迷... A. u 考场 半天才搞懂"下三角区域"指哪个区域,手模样例确认后打了 \(O(qn^2)\) 的裸暴力,然后就不会做了. ...
- IKEv2协议关键知识点总结整理
文章目录 @[toc] 1. IKEv2基本原理 2. IKEv2协议重点注意事项 2.1 情景一:==IKEv2协商密钥逻辑== ①密钥协商流程 ②函数调用关系 ③流程简述 2.2 情景二:==使用 ...