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. 全方位认识HBase:一个值得拥有的NoSQL数据库(一)

    前言:说起HBase这门技术,在认知上对于稍微接触或使用过它的人来讲,可能只是百千数据库中一个很普通的库,大概就像我对Redis的认知一样:缓存嘛!可对于HBase,我确实是带着某些感情在的.今日突然 ...

  2. xxx 表 is marked as crashed and last (automatic?) repair 解决办法

    如上图出现 xxx 表 is marked xxxx   的问题 运维那说是因为数据库非正常停掉 时 刚好有数据正在写入 数据库 导致的问题,这个没多大影响,需要 执行命令修复数据库,至于命令是什么? ...

  3. 02-css3之2D转换

    一.CSS3 -2D转换 转换(transform)可以实现元素的位移.旋转.缩放等效果.可以理解为变形. 1. 2D转换之移动translate 可以改变元素的页面中的位置,类似于定位. 1.1语法 ...

  4. Linux常用命令02(远程管理)

    01 关机/重启 序号 命令 对应英文 作用 01 shutdown 选项 时间 shutdown 关机/重新启动 1.1 shutdown shutdown 命令可以 安全 关闭 或者 重新启动系统 ...

  5. 实验一 熟悉IDLE和在线编程平台

    实验目的 1.掌握python IDLE集成开发环境的安装与使用 2.熟悉在线编程平台 3.掌握基本的python程序编写.编译与运行程序的方法 实验内容 1.按照实验指导安装IDLE,尝试交互式运行 ...

  6. JavaScript的运行机制!!!很重要很重要!!!!!!请看大神操作!

    https://juejin.im/post/59e85eebf265da430d571f89

  7. Java2年开发工作经验面试总结

    Java2年开发工作经验面试总结最近换了个公司,从二月底开始面,面到三月底,面了有快二十五家公司.我是一个喜欢总结经验的人,每经过一场面试,我在回来的路上都会仔细回想今天哪些问题可以答的更好,或者哪些 ...

  8. python3如何不生成pyc文件

    使用-B参数 即 python3 -B test.py 设置环境变量 export PYTHONDONTWRITEBYTECODE=1 在导入的地方增加 import sys sys.dont_wri ...

  9. kubernetes的Service是什么?

    service到底是什么? k8s的service定义了一个服务的访问入口地址,前端的应用通过这个入口地址访问其背后的一组由pod副本组成的集群实例.来自外部的访问请求被负载均衡到后端的各个容器应用上 ...

  10. 获取 保存 系统信息 [Windows]

    出处:https://www.technig.com/find-windows-10-system-information/ 在“运行”里,运行 msinfo32. System Informatio ...