前言:

JDK8后,源码中开始应用Lambda表达式,所以如果想读懂源码的同学学习它是绕不过去的,至于lambda表达式在不在开发中使用,就要看自己的需求啦,他的优点很明显,简洁,非常容易并行计算,提升开发效率,缺点是不并行计算时很多时候还没有for循环快,不容易调试,对于没有学过lambda表达式的程序员的可读性差,所以学不学看自己需求。这篇文章主要讲解下Lambda表达式语法及应用,感兴趣的可以一起探讨下。

正文:

一、什么是Lambda

1.Lambda概述

Lambda 表达式是 JDK8 的一个新特性,可以取代大部分的匿名内部类,写出更优雅的 Java 代码,尤其在集合的遍历和其他集合操作中,可以极大地优化代码结构。

Lambda 表达式体现的是轻量级函数式编程思想。

‘->’ 符号式Lambda表达式核心操作符号,符号左侧是操作数,符号右侧是操作表达式

2.MCAD模式

MCAD模式即Model Code as Data,编码及数据,尽可能轻量级的将代码封装为数据。在没有出现Lambda表达式之前,我们往往都是通过匿名内部类来让代码变得轻量级。

3.问题

匿名内部类的写法存在以下几种问题:

语法冗余,我们可以看到下面使用匿名内部类和lambda表达式的写法上的区别

 public static void main(String[] args) {//1.传统模式下,新线程的创建new Thread(new Runnable() {@Overridepublic void run() {System.out.println("threading..."+Thread.currentThread().getId());}}).start();//2.jdk8新特性,lambda表达式优化线程new Thread(()->{System.out.println("threading..."+Thread.currentThread().getId());}).start();}

变量捕获 

匿名内部类的里面的this关键字,表示当前匿名内部类型的对象。

lambda表达式的里面的this关键字,表示的就是所属方法所在类型的对象。

为什么要用Lambda

  • 它不是解决未知问题的新技术。
  • 对现有解决方案的语义化优化。
  • 需要根据实际需求考虑性能问题。

二、Lambda表达式基础知识

1.函数式接口

函数式接口,就是Java类型系统中的接口。

函数式接口,是只包含一个接口方法的特殊接口。

/**
* @Description 是否快乐的接口
**/
@FunctionalInterface
public interface IsHappy {/*     * @Description 检验是否快乐     * @Param [key]     * @return java.lang.String**/String verifyHappy(String key);
}

我们在加上语义化检测注解:@ FunctionalInterface后,只可以定义一个接口方法否则会报错

但是函数式接口是可以和默认接口方法,静态接口方法,来自Object继承的方法。

2.Lambda表达式和函数式接口的关系

函数式接口,只包含一个操作方法。

Lambda表达式,只能操作一个方法。

Java中的Lambda表达式,核心就是一个函数式接口的实现。

3.常见的函数接口

java.util.function.Predicate<T> (接收参数对象T,返回一个boolean类型结果)

public class Test5 {public static void main(String[] args) {Predicate<String> pre=(String meimei)-> {return "yujie".equals(meimei);};System.out.println(pre.test("luoli"));System.out.println(pre.test("yujie"));}}

运行结果:

java.util.function.Consumer<T>(接收参数对象T,不返回结果)

Consumer<String> con=(String message)->{System.out.println("要发送的消息: "+message);System.out.println("消息发送完成");};con.accept("新年快乐");

运行结果:

java.util.function.Function<T,R> (接收参数对象T,返回结果对象R)

 Function<String,Integer> fun=(String gender)->{return "male".equals(gender)?1:0;};System.out.println(fun.apply("male"));

运行结果:

4.Lambda基本语法

声明:就是和lambda表达式绑定的接口类型。

参数:包含在一对圆括号中,和绑定的接口中的抽象方法中的参数个数及顺序一致。

操作符:->

执行代码块:包含在一对大括号中,出现在操作符号的右侧。

[接口声明] = (参数)->{执行代码块};

注意事项:

  • lambda表达式,必须和接口进行绑定。
  • lambda表达式的参数,可以附带0个到n个参数,括号中的参数类型可以不用指定,jvm在运行时,会自动根据绑定的抽象方法中的参数进行推导
  • lambda表达式的返回值,如果代码块只有一行,并且没有大括号,不用写return关键字,单行代码的执行结果,会自动返回。
  • 如果添加了大括号,或者有多行代码,必须通过return关键字返回执行结果。

没有参数,没有返回值的lambda表达式绑定的接口

public class Test6 {public static void main(String[] args) {ILambda1 i1=()->{System.out.println("放假了");System.out.println("快了");};i1.test();//只有一行代码的时候可以省略花括号ILambda1 i2=()-> System.out.println("在坚持一下");i2.test();}
}
//没有参数,没有返回值的lambda表达式绑定的接口interface ILambda1{void test();}

带有参数,没有返回值的lambda表达式 

public class Test6 {public static void main(String[] args) {ILambda2 i1=(String n,int a)->{System.out.println(n+"-----------"+a);};i1.test("我喜欢",18);//lambda表达式会自动进行类型推导ILambda2 i2=(n,a)->{System.out.println(n+"-----------"+a);};i2.test("我喜欢",18);}//带有参数,没有返回值的lambda表达式 interface ILambda2{void test(String name, int age);
}
}

带有参数,带有返回值的lambda表达式  

public class Test6 {public static void main(String[] args) {ILambda3 i1=(int x,int y)->{int z=x+y;return z;};System.out.println(i1.test(2,18));//lambda表达式会自动进行类型推导ILambda3 i2=(x,y)->x+y;System.out.println(i2.test(2,18));}//带有参数,带有返回值的lambda表达式  interface ILambda3{int test(int x ,int y);
}
}

5.类型检查

public class Test6 {public static void test(MyInterface<String, List> inter){List<String> list=inter.strategy("hello",new ArrayList());System.out.println(list);}public static void main(String[] args) {test(new MyInterface<String, List>() {@Overridepublic List strategy(String s, List list) {list.add(s);return list;}});test((x,y)->{y.add(x);return y;});}
}
@FunctionalInterface
interface MyInterface<T,R>{R strategy(T t,R r);
}

6.Lambda运行原理

1.lambda表达式在编译的时候生成私有的静态方法,在静态方法中会做一个方法的实现来吹

2.并且编译时还会对lambda表达式的目标接口来生成一个内部类型,实现这个接口

3.在实现接口的方法中会第一步生成的静态方法进行调用

4.最后通过new了一个内部类型对象来调用方法执行lambda表达式

三、Lambda表达式高级扩展

1.lambda对集合的基本操作

public class Test {public static void main(String[] args) {//存储Person对象的列表List<Person> personList = new ArrayList<>();personList.add(new Person("dada","男",18));personList.add(new Person("dada","男",20));personList.add(new Person("dada","男",23));personList.add(new Person("dada","男",22));personList.add(new Person("dada","男",16));personList.add(new Person("dada","男",12));//lambda表达式的实现方式Collections.sort(personList,(p1,p2)->p1.getAge()-p2.getAge());System.out.println("lambda表达式的实现方式"+"-------------"+personList);}
}@Data
@AllArgsConstructor
@NoArgsConstructor
class Person{/*** 姓名**/private String name;/*** 性别**/private String gender;/*** 年龄**/private int age;
}

2.什么是stream

lambda表达式操作的stream并不是指io中的流对象,也不是集合元素,也不是数据结构,并不能存储数据,而是和算法和运算有关的流。

Stream结合lambda表达式的demo

 public static void main(String[] args) {//1.添加测试数据:存储多个账号的列表List<String> accounts = new ArrayList<>();accounts.add("dada");accounts.add("dada1");accounts.add("dada12");accounts.add("dada123");accounts.add("dada1234");//1.1 业务要求:长度大于等于5的有效账号for (String a:accounts) {if(a.length()>=5){System.out.println("有效账号:"+a);}}//1.3 Stream结合lambda表达式,完成业务处理List<String> collect = accounts.stream().filter(s -> s.length() >= 5).collect(Collectors.toList());System.out.println(collect);}

总结:

快过年了,提前祝大家新年快乐。

然后还是分享一个鸡汤:如果事与愿违,请相信一定是另有安排。

我是阿达,一名喜欢分享知识的程序员,时不时的也会荒腔走板的聊一聊电影、电视剧、音乐、漫画,这里已经有16844位小伙伴在等你们啦,感兴趣的就赶紧来点击关注我把,哪里有不明白或有不同观点的地方欢迎留言!

Lambda表达式语法及应用相关推荐

  1. java8 lambda python_【学习笔记】java8 Lambda表达式语法及应用

    本文是慕课网大牧莫邪老师的视频教程一课掌握Lambda表达式语法及应用的学习笔记.如果觉得内容对你有用,可以购买老师的课程支持一下,课程价格1元,十分良心了. 1. 课程介绍 2. 为什么引入Lamb ...

  2. lambda表达式语法_使用类似Lambda的语法作为Java中的表达式进行切换

    lambda表达式语法 从Java 14开始, switch表达式具有其他Lambda式 ( case ... -> labels )语法,它不仅可以用作语句,还可以用作计算为单个值的表达式. ...

  3. Java 8 之lambda表达式语法

    1. 简介 lambda表达式可以这样定义(不精确,自己的理解):一段带有输入参数的可执行语句块. //这里省略list的构造 List<String> names = ...; Coll ...

  4. Lambda表达式语法 (二)

    1. Stream体验 我们先来看看Java里面是怎么定义Stream的: A sequence of elements supporting sequential and parallel aggr ...

  5. Java8 Lambda表达式语法和示例

    本文是对官方文档(https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html)的概括总结,更详细的内容请看官方 ...

  6. [C++11]lambda表达式语法

    代码如下: #include <iostream> using namespace std;void func(int x, int y) {int a;int b;[=]() {int ...

  7. java8 lamda表达式相等_java8之lambda表达式(lambda表达式语法)

    到目前为止,在Java中向其他代码传递一段代码并不是很容易.你不可能将代码块到处传递.由于java是一个面向对象的语言,因此你不得不构建一个属于某个类的对象,由它的某个方法来包含所需的代码. lamb ...

  8. 【Kotlin】Lambda 表达式 ( 简介 | 表达式语法 | 表达式类型 | 表达式返回值 | 调用方式 | 完整示例 )

    文章目录 I . Lambda 表达式 简介 II . Lambda 表达式语法 III . Lambda 表达式类型 IV . Lambda 表达式返回值 V . Lambda 表达式调用 VI . ...

  9. java8 ie_Java8语法糖之Lambda表达式_Hudie.的博客-CSDN博客

    原文作者:编程一只蝶 原文标题:Java8语法糖之Lambda表达式 发布时间:2021-02-16 13:08:40 一.Lambda表达式简介 Lambda表达式,是Java8的一个新特性,也是J ...

最新文章

  1. 10年内,这19个关键技术将改变世界!
  2. abaqus python二次开发攻略_Abaqus有限元分析常见问题解答与实用技巧 12天后上架...
  3. 在以阶段划分的编译过程中,判断程序语句的形式是否正确属于()阶段的工作。
  4. Mongodb 基础 查询表达式
  5. Ubuntu系统下载缓慢,以及更新源卡住不动(终极解决方案)
  6. 【渝粤题库】广东开放大学 大学英语B 形成性考核 (2)
  7. 流水灯c语言实验报告心得,嵌入式流水灯实验心得体会.docx
  8. Linux概述及centos版本介绍和下载地址
  9. PHP实现当前文件夹下所有文件和文件夹的遍历
  10. python去除列表指定位置元素_Python实现判断并移除列表指定位置元素的方法
  11. 基于spring boot 轻量级的完全开源商城 mall4j
  12. 【成功实践篇】VirtualBoX虚拟机和本地共享存储目录
  13. 软件测试岗完美面试攻略
  14. 如何快速压缩PPT文件?
  15. HTML文本框边框宽度,如何设置文本框尺寸 word文本框怎么设置统一大小
  16. zc706开发板的linux开发,第一篇:zc706 开箱及开发环境搭建
  17. Java单精度与双精度区别_java单精度和双精度的区别
  18. (1条消息) CodeForces 1278 B.A and B(Math)
  19. 产品经理究竟是干嘛的
  20. 【区块链羊毛 一分钟 20+】IOST社区共建计划,参与得IOST奖励

热门文章

  1. php将图片转化成文字,什么软件可以将图片转换成文字,图片转换成文字的方法...
  2. InDesign 教程:如何创建和编辑图形元素的框架?
  3. 2022-2028全球与中国LNMO电池材料市场现状及未来发展趋势
  4. 30家TWS蓝牙SOC芯片厂集成CPUDSPCodec IP比较
  5. win10蓝牙已配对连接不上_Win10系统蓝牙配对手机连接不成功的解决方法
  6. 微软ERP dynamics Axapta中的保留字
  7. vue引入音乐播放器插件
  8. 如何线上运营一个火锅店
  9. mysqldump出现killed问题
  10. td 属性修改 html,HTML: td 标签