Java Lambda表达式

在 JDK 1.8 中加入了Lambda表达式

1. 函数式编程思想

  • 面向对象思想:

    做一件事情,找一个能解决这个事情的对象,调用对象的方法,完成事情。
  • 函数式编程思想:

    只要能获取到结果,谁去做的,怎么做的都不重要,重视的是结果,不是过程。

2. 体验Lambda的更优写法

  • 匿名内部类的方式
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"线程3号");
}
}).start();
  • Lambda 表达式的方式
new Thread(() -> {
System.out.println(Thread.currentThread().getName()+"λ");
}).start();

3. Lambda表达式的标准格式

  1. 一些参数
  2. 一个箭头
  3. 一段代码
  • 格式:
(参数列表) -> {一些重写方法的代码};
  • 解释说明格式:

    • ():接口中抽象方法的参数列表,没有参数就空着;有参数就写出参数,多个参数使用逗号分隔。
    • ->:传递的意思,把参数传递给方法体 { }
    • {}:重写接口的抽象方法的方法体

4. 练习:使用Lambda表达式(无参无返回)

/*
题目:
给定一个厨子Cook接口,内含唯一的抽象方法 makeFood,且无参数,无返回值
使用 Lambda表达式的标准格式调用 invokeCook方法,打印输出“吃饭啦!”字样
*/
public class Demo01Cook {
public static void main(String[] args) {
// 使用匿名内部类
invokeCook(new Cook() {
@Override
public void makeFood() {
System.out.println("吃饭啦!");
}
});
// 使用 Lambda表达式
invokeCook(() -> {
System.out.println("吃饭啦!");
});
} public static void invokeCook(Cook cook) {
cook.makeFood();
} } // ====================
public interface Cook {
public abstract void makeFood();
}

5. 练习:使用Lambda表达式(有参有返回)

import java.util.Arrays;
import java.util.Comparator; /*
需求:
使用数组存储多个Person对象,对数组中的多个Person对象
按照年龄进行升序排序,并打印输出
*/
public class Demo01Arrays {
public static void main(String[] args) {
Person[] arr = {
new Person("柳岩", 38),
new Person("迪丽热巴", 18),
new Person("马儿扎哈", 19)
}; /*Arrays.sort(arr, new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.getAge() - o2.getAge();
}
});*/ // 使用 Lambda表达式
Arrays.sort(arr, (Person o1, Person o2) -> {
return o1.getAge() - o2.getAge();
}); for (Person person : arr) {
System.out.println(person);
} }
}

6. 练习:使用Lambda表达式(有参有返回)

/*
需求:
给定一个 Calculator计算器接口,内含抽象方法 calc,可以将两个 int型数字相加
返回和,使用Lambda表达式的标准格式调用 invokeCalc方法,完成120和130的计算
*/
public class DemoCalculator {
public static void main(String[] args) {
// 使用匿名内部类调用
/*invokeCalc(120, 130, new Calculator() {
@Override
public int calc(int a, int b) {
return a + b;
}
});*/
// 使用Lambda表达式调用
invokeCalc(120, 130, (int a, int b) -> {
return a + b;
}); } public static void invokeCalc(int a, int b, Calculator c) {
int result = c.calc(a, b);
System.out.println("结果是:" + result);
}
}
// ================ public interface Calculator {
public abstract int calc(int a, int b);
}

7. Lambda的省略格式

  • Lambda表达式:是可推导,可省略的。
  • 凡是根据上下文推导出来的内容,都可以省略书写。
  • 可以省略的内容:
    1. (参数列表):括号中参数列表的数据类型,可以省略不写。
    2. (参数列表):括号中的参数如果只有一个,那么类型和()都可以省略。
    3. (一些代码):如果{ }中的代码只有一行,无论是否有返回值,都可以省略({ },return,分号)。

注意:要省略{ },return,分号必须一起省略。

8. Lambda的使用前提

  1. 使用 Lambda必须具有接口,且要求接口中有且仅有一个抽象方法

    无论是 JDK内置的RunnableComparator接口还是自定义的接口,只有当接口中的抽象方法存在且唯一时,才可以使用 Lambda。
  2. 使用 Lambda必须具有上下文的推断

    也就是方法的参数或者是局部变量类型必须为 Lambda对应的接口类型,才能使用 Lambda作为该接口的实例。

备注:有且仅有一个抽象方法的接口,称为“ 函数式接口 ”。

Java λ表达式的更多相关文章

  1. Atitti.java exp ast java表达式语法ast构造器

    Atitti.java exp ast java表达式语法ast构造器 /atiplat_cms/src/com/attilax/lang/AstParser.java 原理 分割tokens_sli ...

  2. Java表达式转型规则

    Java表达式转型规则由低到高转换: 1.所有的byte,short,char型的值将被提升为int型: 2.如果有一个操作数是long型,计算结果是long型: 3.如果有一个操作数是float型, ...

  3. MyEclipse格式化JSP代码导致Java表达式<%= %>自动换行的解决办法

    MyEclipse格式化JSP代码导致Java表达式<%= %>自动换行的解决办法: 可以将Java表达式<%= %>换成EL表达式.

  4. java表达式

    JAVA表达式优先级: (如果表达式复杂可直接括号处理) 资源来自尚学堂java视频

  5. Java表达式计算转型规则

    本题答案应为:B.C.D ------------知识点------------ Java表达式转型规则由低到高转换(例如int 到 double): 1.所有的byte,short,char型的值将 ...

  6. java表达式陷阱

    以下是一些常见的面试java问题的表达,我将造成直接的形式附加目光. 问题1: int a = 10; int b = a + (a = 5) + a + (a = 10); System.out.p ...

  7. Java表达式中的那些坑

    [1]您确定真正了解后缀表达式与前缀表达式的区别吗? public class IncrementDemo{ public static void main(String[] args) { int ...

  8. java表达式类型的自动提升

    当一个java算术表达式中包含多个基本类型的值时,整个算术表达式的数据类型将发生自动提升.Java定义如下的自动提升规则:1. 所有byte型.short型和char型将被提升到int型. 2. 整个 ...

  9. 计算器类(C++&JAVA——表达式转换、运算、模板公式)

    运行: (a+b)*c 后缀表达式:ab+c* 赋值: Enter the a : 10 Enter the b : 3 Enter the c : 5 结果为:65 代码是我从的逻辑判断系统改过来的 ...

  10. Java 表达式解析(非原创)

    因项目需要,在网上找来一套表达式解析方法,由于原来的方法太过于零散,不利于移植,现在整理在同一文件内: 文件中包含5个内部类,源码如下: import java.util.ArrayList; imp ...

随机推荐

  1. Java基础】并发 - 多线程

    Java基础]并发 - 多线程 分类: Java2014-05-03 23:56 275人阅读 评论(0) 收藏 举报 Java   目录(?)[+]   介绍 Java多线程 多线程任务执行 大多数 ...

  2. 让图片适合在静态文本控件窗口大小 MFC

    1.加入 IDC_STATIC1 静态文本控件. 2.为文本控件添加 STATIC 型变量 3.在OnInitDialog函数中添加以下代码 //设置该静态控件为显示位图的 m_bitmap.Modi ...

  3. 从python爬虫以及数据可视化的角度来为大家呈现“227事件”后,肖战粉丝的数据图

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取t.cn ...

  4. self不明白什么意思,我来帮助你了解self的含义

    先看下面这段代码 # 用函数模仿类def dog(name, gender): def jiao(dog1): print('%s汪汪叫' % dog1["name"]) def ...

  5. PL/SQL 九九乘法表

    和shell脚本九九乘法表一样,只是语法有少出入 先看看效果图先: 利用for循环: SET SERVEROUTPUT ON DECLARE x INT :=1; y INT :=1; BEGIN F ...

  6. QMessage自动定时关闭

    QMessageBox *box = new QMessageBox(QMessageBox::Information,tr("test"),tr("testtest&q ...

  7. [Qt] 打开Diskmgmt

    QProcess mOpenDiskMgmt; QString program = "cmd"; QStringList arguments; arguments << ...

  8. Libra教程之:运行自定义move modules

    文章目录 简介 创建Move modules 启动本地网络 创建账号并送测试币 编译Move Module 发布编译好的Module 创建交易脚本 编译编译脚本 执行脚本 简介 因为Libra和Mov ...

  9. Linux系统管理第五次作业 LVM逻辑卷 磁盘配额

    1.为主机增加80G SCSI 接口硬盘 2.划分三个各20G的主分区 [root@localhost ~]# fdisk /dev/sdf 欢迎使用 fdisk (util-linux 2.23.2 ...

  10. js 实现淘宝放大镜功能,可更改配置参数 带完整版解析代码[magnifier.js]

    前言:         本人纯小白一个,有很多地方理解的没有各位大牛那么透彻,如有错误,请各位大牛指出斧正!小弟感激不尽.         本篇文章为您分析一下原生JS写淘宝放大镜效果 基本功能: 运 ...