1、Lambda表达式时Java 8新增的特性。Lambda表达式支持将代码块作为方法参数,Lambda表达式允许使用更简洁的代码创建只有一个抽象方法的接口(即函数式接口)的实例。

2、当使用Lambda表达式代替匿名内部类创建对象时,Lambda表达式的代码块会代替实现抽象方法的方法体,Lambda表达式就相当于一个匿名方法。Lambda表达式由3部分组成:

1》形参列表:形参列表允许省略形参类型。如果形参列表中只有一个参数,甚至连形参列表的圆括号也可以省略。

2》箭头(->):必须通过英文中画线和大于号组成。

3》代码块:如果代码块只包含一条语句,Lambda表达式允许省略代码块的花括号。Lambda代码块只有一条return语句,甚至可以省略return关键字。Lambda表达式需要返回值,而它的代码块中仅有一条省略了return的语句,Lambda表达式会自动返回这条语句的值。

3、Lambda表达式与函数式接口

Lambda表达式的类型,也被称为“目标类型(target type)”,Lambda表达式的目标类型必须是函数式接口。函数式接口可以包含多个默认方法、类方法,但只能声明一个抽象方法。

Java 8专门为函数式接口提供了@FunctionalInterface注解,该注解通常放在接口定义前面,该注解对程序功能没有任何作用,只是告诉编译器要更严格的检查该定义的接口是否满足函数式接口的要求,即只包含一个抽象方法,否则编译器报错。

//Runnable是Java本身提供的函数式接口
//Lambda表达式的结果被当成一个对象
//使用Lambda表达式赋值
Runnable rn=() -> {for(int i=0;i<100;i++){System.out.println("这里是run()方法体.");    }
};

从上面的实现可知,Lambda表达式实现的是一个匿名方法。Lambda表达式的局限性:

1》Lambda表达式的目标类型必须是明确的函数式接口

2》Lambda表达式只能为函数式接口创建对象。Lambda表达式只能实现一个方法,因此它只能为一个抽象方法的接口(函数式)接口创建对象。

如果上面的代码赋值给Object类型,由于Object类不是明确的函数式接口,编译过程会报错“不是函数接口”。

4、方法引用和构造器引用

前面已经提到,如果Lambda表达式的代码块只有一条语句,可以省略花括弧,其实还可以在代码中使用方法引用和构造器引用。方法引用和构造器引用可以让Lambda表达式的代码块更加简洁。方法引用和构造器引用都需要使用两个英文冒号(::)。

Lambda表达式支持的方法引用和构造器引用

种类 示例 说明 对应的Lambda表达式
引用类方法 类名::类方法 函数式接口中被实现的全部参数传递给该类方法作为参数 (a,b,...)->类名.类方法(a,b,...)
引用特定对象的实例方法 特定对象::实例方法 函数式接口中被实现方法的全部参数传给该方法作为参数 (a,b,...)->特定对象.实例方法(a,b,...)
引用某类对象的实例方法 类名::实例方法 函数式接口中被实现方法的第一个参数作为调用者,后面的参数全部传给该方法作为参数 (a,b,...)->a.实例方法(b,...)
引用构造器 类名::new 函数式接口中被实现方法的全部参数传递给该构造器作为参数 (a,b,...)->new 类名(a,b,...)

1》引用类方法:

@FunctionalInterface
public interface Converter{Integer convert(String from);
}
...
//创建一个匿名对象
Converter converter1= from -> Integer.valueOf(from);
Integer val=converterl.convert("99");
System.out.println(val);------------------------
Converter converter1= Integer::valueOf;

2》引用特定对象的实例方法

@FunctionalInterface
public interface Converter{Integer convert(String from);
}
...
//创建一个匿名对象
Converter converter1= from -> "hello".indexOf(from);
Integer val=converterl.convert("ll");
System.out.println(val);------------------------
Converter converter1= "hello"::indexOf;

转载于:https://www.cnblogs.com/ZeroMZ/p/11378686.html

Java-Lambda表达式第一篇认识Lambda表达式相关推荐

  1. JAVA消息(第一篇)JMS 很重要!!!!包教包会!!不闹!!!下一篇-AMQP(wire-level protocol)

    如果看完:进入第二篇AMQP 首先大致讲一下,java 消息模块 消息,个人理解分为两种:1.同步消息(RPC调用) 2.异步消息(本篇讲解部分) 一.同步消息java提供了多种方案: 最新比较常用的 ...

  2. Java队列学习第一篇之列介绍

    在面试的过程中有可能会问到:在Java并发编程中,锁有两种实现:使用隐式锁和使用显示锁分别是什么?两者的区别是什么?所谓的显式锁和隐式锁的区别也就是说说Synchronized(下文简称:sync)和 ...

  3. 漫漫java路:第一篇 误上贼船

    开场白:还是觉得有自我介绍一下的必要,以避免大家把我误认为高手了(其实只是一条可怜的菜青虫!). 本人大懒人一个,2004.7大学毕业(专业:化工).7月第一次参加工作,待遇还不错.可惜天有不测风云, ...

  4. 辛星Java动态规划教程第一篇:求斐波那切数列

    对于理解动态规划来说,最简单的题目还是求斐波那切数列的第i个值.很多资料都把它作为一个印子,以此来介绍动态规划的基本定义. 不过也有些书认为菲波那切数列过于简单,以致于不能让读者感受到动态规划的优美之 ...

  5. Java并发编程|第二篇:线程生命周期

    文章目录 系列文章 1.线程的状态 2.线程生命周期 3.状态测试代码 4.线程终止 4.1 线程执行完成 4.2 interrupt 5.线程复位 5.1interrupted 5.2抛出异常 6. ...

  6. java lambda表达式_恕我直言你可能真的不会java第1篇:lambda表达式会用了么?

    本文配套教学视频:B站观看地址 在本号之前写过的一些文章中,笔者使用了lambda表达式语法,一些读者反映说代码看不懂.本以为java 13都已经出了,java 8中最重要特性lambda表达式大家应 ...

  7. 探索Java语言与JVM中的Lambda表达式

    2019独角兽企业重金招聘Python工程师标准>>> 转载来源:http://www.admin10000.com/document/1291.html Lambda表达式是自Ja ...

  8. java lambda表达式_高性能的 Lambda 表达式,简洁优雅图文并茂

    来源:知乎 Mingqi 链接:https://www.zhihu.com/question/20125256/answer/324121308 有网友问,Lambda 表达式有何用处?如何使用?在P ...

  9. 【Java】反射、枚举、Lambda表达式

    一.反射 1 定义 2 用途(了解) 3 反射基本信息 4 反射相关的类(重要) 4.1 Class类(反射机制的起源 ) 4.1.1 Class类中的相关方法(方法的使用方法在后边的示例当中) 4. ...

  10. lambda java 表达式_Java中的Lambda表达式

    介绍 Lambda函数是 Java 8 附带的一项功能,它是该语言向 函数式编程 迈出的第一步,这是实现各种兼容 范例的 有用功能的普遍趋势. 引入lambda函数的动机主要是为了减少传递给类实例以模 ...

最新文章

  1. 主题已放宽,科研UP主们速来Bio-protocol破浪吧
  2. IE Web 开发支持将迁移到 StackOverflow
  3. 数据结构-单向循环链表、双向循环链表、仿真链表
  4. 十大经典排序算法之选择排序及其优化
  5. 校验码(海明校验,CRC冗余校验,奇偶校验)
  6. 直接在安装了redis的Linux机器上操作redis数据存储类型--hash类型
  7. 用Java通讯录字母排序,按所有Catorgories显示联系人数据库标记,然后按字母顺序排序| PHP SQL...
  8. 数据结构(二十)二叉树的递归遍历算法
  9. Deep Learning 和 Knowledge Graph howto
  10. java多线程-线程生命周期及状态
  11. 使用自定义文件选择按钮选择文件
  12. SAP License:SAP反记帐和红字冲销
  13. 「磨金石教育学员插画作业」什么是日系插画?
  14. 论文阅读——Globally and Locally Consistent Image Completion
  15. 如何使用图片的exif信息计算相机焦距
  16. PCB与设备外壳接地问题
  17. 华硕笔记本升级固态SSD过程
  18. 基于Python的微信朋友圈数据可视化分析之地点
  19. 基于Eclipse的毕业设计题目50例
  20. Linux漏洞:showmount -e信息泄露(CEE-1999-0554)

热门文章

  1. LINUX编译java3d/j3d
  2. OpenJDK8 JAVA应用窗口在不同缩放比例下的表现(Linux)
  3. LINUX下载编译python
  4. 短路主板电源针,启动电脑的办法
  5. maven teavm-idea-artifacts: Command execution failed.: Process exited with an error: 1 Exit value: 1
  6. 文字处理技术:视图坐标都是在父视图的相对坐标
  7. LINUX下载编译libgsm
  8. 庆贺使用VS2017编译OpenJDK12成功!
  9. C调用Python的示例代码
  10. Day15Day16多任务和任务切换