Lambda表达式是给函数式接口(SAM接口)的变量或形参赋值的表达式。
Lambda表达式替代了原来使用匿名内部类的对象给函数式接口(SAM接口)的变量或形参赋值的形式。

匿名内部类:实现了这个接口,重写了接口的抽象方法,同时创建了对象。
Lambda表达式也要实现这个接口,重写接口的抽象方法,隐含的创建了对象。
既然Lambda表达式是SAM接口的变量或形参赋值的,那么实现接口这部分语法可以省略,SAM接口的抽象方法只有一个,因此方法签名可以省略一部分。
例如:修饰符,返回值类型、方法名可以省略,但是其中的形参列表不能省略,因此这里表表现形参类型和形参名,这个在方法体的实现中要使用。

Lambda表达式语法格式:
(形参列表) -> {Lambda体}

说明:

(1)(形参列表)就是SAM接口的抽象方法的形参列表
(2){Lambda体}就是实现SAM接口的抽象方法的方法体
(3)->称为Lambda操作符,由“减号”和“大于号”构成,中间不能有空格

优化:
(1)如果{Lambda体}只有一句语句,可以省略{}以及{}中的语句的结束;,如果{}没有省略的话,;就不能省略
(2)如果(形参列表)中形参的类型是已知的,获取可以推断,那么数据类型可以省略
(3)如果(形参列表)只有一个形参,并且数据类型也已经省略了,那么这个()可以省略了,如果数据类型没有省略,()不能省略
(4)如果{Lambda体}只有一句语句,并且是一个return语句,那么可以省略{}以及{}中的语句的结束;还有return。
(5)如果没有形参,()不能省略

public class TestLambda {
@Test
public void test(){
//使用Lambda表达式给Runnable接口的形参赋值,这个线程要打印“尚硅谷"
//构造器:new Thread(Runnable target)
//现在要用Lambda表达式给Runnable类型的target形参赋值 /*
* Lambda表达式只需要关注两个事情:
* (1)抽象方法长什么样 -->形参列表怎么写
* public void run()
* (2)抽象方法怎么实现,即这个抽象方法要做什么事情 -->Lambda体
*/
//new Thread(() -> {System.out.println("这台车,我要了!");}).start(); //优化
new Thread(() -> System.out.println("这台车,我要了!")).start();
   }
}

public class TestLambda {
  @Test
  public void test02(){
/*
* 在Java8版本,给Iterable<T>这个接口增加一个默认方法
* default void forEach(Consumer<? super T> action) 这个方法可以遍历容器中的元素,做xx事情
*
* Collection<E>接口继承了Iterable<T>接口,说明Collection系列的集合都有这个方法,例如:ArrayList
*
*/
  ArrayList<String> list = new ArrayList<>();
  list.add("我");
  list.add("要");
  list.add("买");
  list.add("车"); /*
* forEach方法的形参是Consumer类型,它是消费型接口的类型,是SAM接口,就可以使用Lambda表达式赋值
* (1)接口的抽象方法
* void accept(T t) 这里方法名不重要,只看返回值类型和形参列表
* (2)要如何实现这个抽象方法,例如:我这里要打印元素
*/

      list.forEach((String str) -> {System.out.println(str);});

      //优化
      list.forEach((String str) -> System.out.println(str));

      //再优化
      list.forEach((str) -> System.out.println(str));

      //再再优化
      list.forEach(str -> System.out.println(str));

    }
}

结果:

我要买车我要买车我要买车我要买车

我们试试删除

public void test03(){
//从集合中删除字符个数超过5个的
ArrayList<String> list = new ArrayList<>();
     list.add("1234567")
list.add("123456");
list.add("12345");
list.add("1234");
list.add("123"); /*
* Java8中Collection接口增加了一个方法
* default boolean removeIf(Predicate<? super E> filter)
* 这个方法的形参是Predicate判断型接口,是SAM接口,可以使用Lambda表达式赋值
*
* Predicate<T>判断型接口
* (1)抽象方法
* boolean test(T t)
* (2)如何实现抽象方法
* 这里判断条件是 字符个数>6
*/
/* list.removeIf((String str) -> {
if(str.length()>6){
return true;
}else{
return false;
}
});*/ //代码优化
list.removeIf((String str) -> {return str.length()>5;}); //再优化
list.removeIf(str -> str.length()>5);
     list.forEach((str)-> System.out.println(str));
}

结果

12345
1234
123

Lambda表达式(二)的更多相关文章

  1. Java 8 Lambda 表达式(二)

    lambdas 实现 Runnable 接口 下面是使用 lambdas 来实现 Runnable 接口的示例: // 1.1使用匿名内部类 new Thread(new Runnable() { @ ...

  2. lambda表达式 <二>

    概念了解: 1.什么是匿名委托(匿名方法的简单介绍.为什么要用匿名方法) 2.匿名方法的[拉姆达表达式]方法定义 3.匿名方法的调用(匿名方法的参数传递.使用过程中需要注意什么) 什么是匿名方法? 匿 ...

  3. 背后的故事之 - 快乐的Lambda表达式(一)

    快乐的Lambda表达式(二) 自从Lambda随.NET Framework3.5出现在.NET开发者眼前以来,它已经给我们带来了太多的欣喜.它优雅,对开发者更友好,能提高开发效率,天啊!它还有可能 ...

  4. 【转】背后的故事之 - 快乐的Lambda表达式(一)

    快乐的Lambda表达式(二) 自从Lambda随.NET Framework3.5出现在.NET开发者眼前以来,它已经给我们带来了太多的欣喜.它优雅,对开发者更友好,能提高开发效率,天啊!它还有可能 ...

  5. .NET进阶篇05-Linq、Lambda表达式

    知识需要不断积累.总结和沉淀,思考和写作是成长的催化剂 内容目录 一.Lambda表达式1.匿名方法2.Lambda表达式二.Linq概述三.查询操作符1.linq初见2.常用查询操作符筛选排序分组连 ...

  6. IDEA问题java: -source 1.6 中不支持diamond、 lambda 表达式

    文章目录 一.问题:连片的java: -source 1.6 中不支持 diamond 运算符.lambda 表达式 二.解决方法: 1.在微信群里问大佬,大佬在玩游戏,回复的比较慢 2.自己查Goo ...

  7. CRL快速开发框架系列教程二(基于Lambda表达式查询)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  8. Util应用程序框架公共操作类(十二):Lambda表达式公共操作类(三)

    今天在开发一个简单查询时,发现我的Lambda操作类的GetValue方法无法正确获取枚举类型值,以至查询结果错误. 我增加了几个单元测试来捕获错误,代码如下. /// <summary> ...

  9. Util应用程序框架公共操作类(八):Lambda表达式公共操作类(二)

    前面介绍了查询的基础扩展,下面准备给大家介绍一些有用的查询封装手法,比如对日期范围查询,数值范围查询的封装等,为了支持这些功能,需要增强公共操作类. Lambda表达式公共操作类,我在前面已经简单介绍 ...

  10. 十二、C# 委托与Lambda表达式(匿名方法的另一种写法)

    委托与Lambda表达式   1.委托概述 2.匿名方法 3.语句Lambda 4.表达式Lambda 5.表达式树   一.委托概述 相当于C++当中的方法指针,在C#中使用delegate 委托来 ...

随机推荐

  1. 【原创】K8S使用ceph-csi持久化存储之RBD

    一.集群和组件版本 K8S集群:1.17.3+Ceph集群:Nautilus(stables)Ceph-CSI:release-v3.1snapshotter-controller:release-2 ...

  2. Flutter继承环信IM-发送视频时失败:No value for fileLength

    首先贴一下代码: 这是发送视频消息的方法 报出一下错误信息: 这是由于在解析的时候JSON里面没有fileLength这个值 往回看发送视频消息api,也并不需要fileLength参数 那顺着错误信 ...

  3. PHP正则表达式核心技术完全详解 第2节

    作者:极客小俊 一个专注于web技术的80后 我不用拼过聪明人,我只需要拼过那些懒人 我就一定会超越大部分人! CSDN@极客小俊,原创文章, B站技术分享 B站视频 : Bilibili.com 个 ...

  4. Mall电商实战项目发布重大更新,全面支持SpringBoot 2.3.0

    1. 前言 前面近一个月去写自己的mybatis框架了,对mybatis源码分析止步不前,此文继续前面的文章.开始分析mybatis一,二级缓存的实现. 附上自己的项目github地址:https:/ ...

  5. 详解如何使用koa实现socket.io官网的例子

    socket.io官网中使用express实现了一个最简单的IM即时聊天,今天我们使用koa来实现一下利用 socket.io 实现消息实时推送 框架准备 1.确保你本地已经安装好了nodejs和np ...

  6. 项目启动加载配置,以及IP黑名单,使用CommandLineRunner和ApplicationRunner来实现(一般用在网关进行拦截黑名单)

    //使用2个类的run方法都可以在项目启动时加载配置,唯一不同的是他们的参数不一样,CommandLineRunner的run方法参数是基本类型,ApplicationRunner的run方法参数是一 ...

  7. Harmony OS 开发避坑指南——源码下载和编译

    Harmony OS 开发避坑指南--源码下载和编译 本文介绍了如何下载鸿蒙系统源码,如何一次性配置可以编译三个目标平台(Hi3516,Hi3518和Hi3861)的编译环境,以及如何将源码编译为三个 ...

  8. 开发基于Django和Websocket的堡垒机

    WebSSH有很多,基于Django的Web服务也有很多,使用Paramiko在Python中进行SSH访问的就更多了.但是通过gevent将三者结合起来,实现通过浏览器访问的堡垒机就很少见了.本文将 ...

  9. centos7卸载mariadb安装mysql

    卸载mariadb 1. 当前安装列表  rpm -qa | grep mariadb 2.卸载 rpm -e --nodeps mariadb-libs-5.5.56-2.el7.x86_64 3 ...

  10. Arduino 语法与函数

    Arduino programs can be divided in three main parts: structure, values (variables and constants), an ...