1、入门

使用场景:如果创建函数式接口(该接口的抽象方法只能有一个)的实例时,使用Lambda表达式更加简洁方便。

2、格式:

(形参列表) -> { 代码块 }

3、简化

只有一个参数时,可以省略圆括号();

代码块只有一条语句,可以省略花括号{};

代码块里只有一个语句时,即是需要return,也可以省略return关键字(仅仅是关键字),

需要返回值时自动返回这条省略了return的语句的值。

4、限制:

1、Lambda表达式的类型必须是函数式接口(不是的话可以强制类型转换,但与目标类型的唯一抽象方法要有相同的形参列表);

2、Lambda表达式只能为函数式接口创建对象;

函数式接口典型例子:

XxxFunction\XxxConsumer\Predicate\XxxSupplier

3、java8为函数式接口提供了@FunctionalInterface注解,放在接口定义前面,告诉编译器对该接口进行检查是否为函数式接口。

public class Demo01 {
//创建Runnable对象,Runnable是一个函数式接口
public static void main(String[] args) {
Runnable r = ()-> System.out.println("Runnable");
Runnable r1 = () -> {
for (int i = 0; i < 2; i++) {
System.out.println(i);
}
};

5、补充

方法引用和构造器引用简化写法

条件:如果代码块只有一条语句时,还可以进一步简化lambda写法。

1.引用类方法

格式: 类名::方法

说明: 接口中被实现方法的全部参数 传给该类方法作参数。

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

格式: 特定对象::实例方法

说明: 接口中被实现方法的全部参数 传给该类方法作参数。

3.引用某类对象的实例方法

格式: 类名::实例方法

说明: 接口中被实现方法的第一个参数作为调用者,剩余参数作为该方法的参数

4.引用构造器

格式: 类名::new

说明: 接口中被实现方法的全部参数 传给该构造器作参数。

//定义一个函数式接口
@FunctionalInterface
interface Demo02 {
//只有一个抽象方法convert()
Integer convert(String from);
}
@FunctionalInterface
interface Demo021{
String test(String a,int b,int c);
}
@FunctionalInterface
interface Demo022{
JFrame win(String title);
}
class Demo03{
public static void main(String[] args) {
//调用Integer类的valueOf方法
Demo02 obj1 = Integer::valueOf;
//调用"99"对象的indexOf()实例方法实现
Demo02 obj2 = "99"::indexOf;
//被实现方法的第一个参数作为调用者
//后面全部参数传给该方法作参数
Demo021 obj3 = String::substring;
//构造器引用
Demo022 obj4 = JFrame::new;
}
}

6、区别

lambda表达式与匿名内部类的区别:

lambda表达式是匿名内部类的一种简化,

  • 相同点:

    1、都可以直接访问effectively final局部变量以及外部类的成员变量(包括实例变量和类变量);

    2、二者创建的对象都可以直接调用从接口中继承的默认方法。

  • 不同点:

    1、匿名内部类可为任意接口创建实例,无论有多少抽象方法,lambda只能为函数式接口创建实例。

    2、匿名内部类可以为抽象类或普通类创建实例,后者只能为函数式接口创建实例。

    3、匿名内部类实现的抽象方法的方法体允许调用接口定义的默认方法,lambda表达式的代码块不允许调用接口定义的默认方法。


下期介绍File类和IO流。

Java自学第9期——Lambda表达式的更多相关文章

  1. Java 终于在 Java 8 中引入了 Lambda 表达式。也称之为闭包或者匿名函数。

    本文首发于 blog.zhaochunqi.com 转载请注明 blog.zhaochunqi.com 根据JSR 335, Java 终于在 Java 8 中引入了 Lambda 表达式.也称之为闭 ...

  2. Java :一文掌握 Lambda 表达式

    本文将介绍 Java 8 新增的 Lambda 表达式,包括 Lambda 表达式的常见用法以及方法引用的用法,并对 Lambda 表达式的原理进行分析,最后对 Lambda 表达式的优缺点进行一个总 ...

  3. Java 8新特性-3 Lambda 表达式

    在 Java 8 之前,匿名内部类,监听器和事件处理器的使用都显得很冗长,代码可读性很差. 在Java 8 之前使用匿名内部类: 例如 interface ITestPrint{ public voi ...

  4. [Java] 设计模式:代码形状 - lambda表达式的一个应用

    [Java] 设计模式:代码形状 - lambda表达式的一个应用 Code Shape 模式 这里介绍一个模式:Code Shape.没听过,不要紧,我刚刚才起的名字. 作用 在应用程序的开发中,我 ...

  5. Java 8 新特性之 Lambda表达式

    Lambda的出现就是为了增强Java面向过程编程的深度和灵活性.今天就来分享一下在Java中经常使用到的几个示例,通过对比分析,效果应该会更好. – 1.实现Runnable线程案例 其存在的意义就 ...

  6. Effective Java 第三版——42.lambda表达式优于匿名类

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  7. Java编程的逻辑 (91) - Lambda表达式

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  8. Java之线程池和Lambda表达式

    线程池和lambda表达式 学习线程池和lambda表达式的理解 补充一个知识点(单例设计模式) 在多线程中,我们只需要一个任务类,为了防止创建多个任务类,这个时候就需要用到单例模式,单例模式有两种设 ...

  9. Java 常用的几个lambda表达式

    Lambda表达式是Java 8一个非常重要的新特性.它像方法一样,利用很简单的语法来定义参数列表和方法体.目前Lambda表达式已经成为高级编程语言的标配,像Python,Swift,C#等都已经支 ...

随机推荐

  1. Spring,Spring MVC,MyBatis,Hibernate总结

    将之前学习的框架知识进行了UML图总结,若有错误或不当之处,劳烦朋友们指正,会及时作出修改和补充: [toc] Spring Spring MVC MyBatis,Hibernate

  2. form(form基础、标签渲染、错误显示 重置信息、form属性、局部钩子、全局钩子)

    form基础 Django中的Form使用时一般有两种功能: 1.生成html标签 2.验证输入内容 要想使用django提供的form,要在views里导入form模块 from django im ...

  3. Linux-yum安装和相关命令

    Linux-yum安装和相关命令 一 yum yum命令是在Fedora和RedHat以及SUSE中基于rpm的软件包管理器,它可以使系统管理人员交互和自动化地更细与管理RPM软件包,能够从指定的服务 ...

  4. Pytest(13)命令行参数--tb的使用

    前言 pytest 使用命令行执行用例的时候,有些用例执行失败的时候,屏幕上会出现一大堆的报错内容,不方便快速查看是哪些用例失败. --tb=style 参数可以设置报错的时候回溯打印内容,可以设置参 ...

  5. 2019牛客暑期多校训练营(第五场)H.subsequence 2(拓扑)

    题意:给你一个字符串的长度n 现在询问了m*(m-1)/2次 每次都可以询问两个字符 然后 会告诉你只留下这两个字符后 字符串的样子 现在问你能不能还原字符串 如果能就输出字符串 否则输出-1 思路: ...

  6. HDU6504 Problem E. Split The Tree【dsu on tree】

    Problem E. Split The Tree Problem Description You are given a tree with n vertices, numbered from 1 ...

  7. 【noi 2.2_7891】一元三次方程求解(二分枚举+输出程序运行时间)

    对于noi上的题有2种解法: 1.数据很小(N=100),可以直接打for循环枚举和判断. 2.不会"三分",便用二分.利用"两根相差>=1"和 f(x1 ...

  8. office响应慢,但电脑速度没问题的解决方案

    看了非常多教程都没有用,有点崩,最后终于解决了,记录一下. 问题描述 :office启动没问题,但word打开后,选中一段文字非常慢,大概延迟鼠标移动2-3秒.点击工具栏时也有延迟(点击动画看的十分清 ...

  9. Kubernets二进制安装(17)之安装部署Dashboard

    1.下载dashboard镜像 在运维主机(mfyxw50.mfyxw.com)上执行命令 [root@mfyxw50 ~]# docker pull registry.cn-hangzhou.ali ...

  10. 数据库之ODPS中sql语句指南

    此篇博文为本人在实际工作中应用总结,转载请注明出处. 持续更新中 一.增 1.增加一列(向csp_hsy_count_info表中增加sale_qty列) ALTER TABLE csp_hsy_co ...