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. 现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行?

    Thread t1 = new Thread(new T1()); Thread t2 = new Thread(new T2()); Thread t3 = new Thread(new T3()) ...

  2. Presto 标量函数注册和调用过程简述

    在Presto 函数开发一文中已经介绍过如何进行函数开发,本文主要讲述标量函数(Scalar Function)实现之后,是如何在Presto内部进行注册和被调用的.主要讲述标量函数是因为:三类函数的 ...

  3. httpclient post推送数据

    客户端代码 /** * 从接口获取数据 * @param url 服务器接口地址 * @param json 传入的参数 若获取全部,此项为空 * @return 返回查询到的数据 * @throws ...

  4. Maven环境搭建及常用命令、生命周期

    一.下载maven包,解压 二.配置环境变量,MAVEN_PATH=解压路径 添加到path中 三.测试  mvn -v 查看maven版本 四.设置本地仓库的路径 在conf文件夹下的setting ...

  5. ECharts系列:玩转ECharts之常用图(折线、柱状、饼状、散点、关系、树)

    一.背景 最近产品叫我做一些集团系列的统计图,包括集团组织.协作.销售.采购等方面的.作为一名后端程序员,于是趁此机会来研究研究这个库. 如果你仅仅停留在用的层面,那还是蛮简单的. 二.介绍 ECha ...

  6. Matlab中num2str函数的用法

    转载:https://blog.csdn.net/SMF0504/article/details/51836062 函数功能: 把数值转换成字符串, 转换后可以使用fprintf或disp函数进行输出 ...

  7. 给Python IDLE添加行号显示

    转载:https://blog.csdn.net/howard2005/article/details/104112297 文章目录一.引出问题1.Spyder编辑Python程序能显示行号2.Pyt ...

  8. matlab中polyfit

    来源:https://ww2.mathworks.cn/help/matlab/ref/polyfit.html?searchHighlight=polyfit&s_tid=doc_srcht ...

  9. LiteOS-任务篇-源码分析-系统启动函数

    目录 前言 链接 参考 开启调度 LOS_Start 函数源码 osTickStart 函数源码 LOS_StartToRun 函数源码 前言 20201009 移植好内核后,开始实战内核. 源码分析 ...

  10. 【记】《.net之美》之读书笔记(二) C#中的泛型

    前言 上一篇读书笔记,很多小伙伴说这本书很不错,所以趁着国庆假期,继续我的读书之旅,来跟随书中作者一起温习并掌握第二章的内容吧. 一.理解泛型 1.为什么要使用泛型?-----通过使用泛型,可以极大地 ...