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表达式的标准格式

一些参数

一个箭头

一段代码

格式:

(参数列表) -> {一些重写方法的代码};

解释说明格式:

():接口中抽象方法的参数列表,没有参数就空着;有参数就写出参数,多个参数使用逗号分隔。

->:传递的意思,把参数传递给方法体 { }

{}:重写接口的抽象方法的方法体

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() {

@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表达式:是可推导,可省略的。

凡是根据上下文推导出来的内容,都可以省略书写。

可以省略的内容:

(参数列表):括号中参数列表的数据类型,可以省略不写。

(参数列表):括号中的参数如果只有一个,那么类型和()都可以省略。

(一些代码):如果{ }中的代码只有一行,无论是否有返回值,都可以省略({ },return,分号)。

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

8. Lambda的使用前提

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

无论是 JDK内置的Runnable、Comparator接口还是自定义的接口,只有当接口中的抽象方法存在且唯一时,才可以使用 Lambda。

使用 Lambda必须具有上下文的推断。

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

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

java λ表达式_Java λ表达式相关推荐

  1. java中平方的表达式_JAVA语言中的运算符和表达式

    JAVA--运算符 按运算符要求的运算符个数可分为一元.二元.三元运算符: 一元运算符有一个操作数:如正数或者负数前面的"+"."-",和自增"++& ...

  2. java 条件表达式_Java 三目运算符

    对于有些选择分支结构,可以使用简单的条件运算符来代替.如: 引用 if(a min=a; else min=b; 可以用下面的条件运算符来处理 min=(a 其中"(a 条件运算符由两个符号 ...

  3. java 三元表达式_Java探究心得之三元运算符

    首先看一下三元运算符的格式 [条件语句] ? [表达式1] : [表达式2] 其中如条件语句为真执行表达式1,否则执行表达式2.简单的例子就不举了,来点其它的.在JDK1.5以前的版本中,表达式1和表 ...

  4. java which语句,java入门之表达式、语句、块

    表达式.语句和块是java语言的基础.运算符(Operator)用来计算值,它和变量(Variable)构成了表达式(Expression),表达式是语句(Statement)的核心部分,而语句又构成 ...

  5. 10个Java 8 Lambda表达式经典示例

    Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表 达式,它将允许我们将行为传到函数里.在J ...

  6. BeanShell中的Java指令和表达式

    我的博客原址:点击此处 BeanShell 能够理解标准的 Java 指令,表达式和方法的语法.那些指令和表达式都是在一个 Java 方法中你会提到的非常常见的东西,像变量的定义和分配,方法调用,循环 ...

  7. 深入理解Java 8 Lambda表达式(Oracle官方文档版)

    Java 8 问世三年了,9马上也要问世了,所以,嗯,我要开始学8了-- 官方文档:http://docs.oracle.com/javase/tutorial/java/javaOO/lambdae ...

  8. Java 8 Lambda 表达式详解

    版权声明:本文由吴仙杰创作整理,转载请注明出处:https://segmentfault.com/a/1190000009186509 1. 引言 在 Java 8 以前,若我们想要把某些功能传递给某 ...

  9. java 的lambda表达式

    2019独角兽企业重金招聘Python工程师标准>>> 为什么使用 Lambda 表达式 lLambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码( ...

最新文章

  1. react input[type='number']
  2. asp.net动态添加控件学习
  3. Logstash配置语法及相关命令
  4. 阿里P8架构师谈:主流RPC框架详解,以及与SOA、SOAP、REST的区别
  5. activiti动态办理人_安全生产许可证办理相关问题
  6. 自定义控件添加属性_|AutoCAD LT 2019 Mac自定义功能区的方法
  7. html里面怎么ul加高度,div里面嵌套了ul,为什么div的高度小于ul高度
  8. Windows Terminal Preview 1.3 发布
  9. 洛谷 P2056 采花
  10. ML算法整理(一)线性回归与梯度下降 python实现
  11. html不使用cache数据
  12. Disk for DB is too low. Cassandra state detected DOWN. Disk space for DB not retrievable
  13. 编程语言试验之Antlr4+JavaScript实现圈4
  14. 上班族难懂五险一金 交的越多是否越吃亏
  15. 普通台式机上Tesla M40显卡paddleGPU深度学习柯南的变身器上机体验
  16. win10安装IIS时报错windows无法请求的更改,错误代码0x8007057解决办法2017年10月15日
  17. 大数据技术学习,深度挖掘大数据的现状分析
  18. 标准模式和怪异模式指的是什么?
  19. 打印机无法确认设备和计算机之间的连接,打印机和电脑连接不上怎么办_电脑怎么连接不上打印机设备-win7之家...
  20. 8、Hudson集成服务器的安装配置与使用

热门文章

  1. linq语句复杂查询和分开查询的性能对比
  2. Mysql自动备份脚本
  3. glCullFace,GL_CULL_FACE
  4. 【转载】PHP报错分析(Corrupted encoded data detected in)
  5. 用 for/in 在 Java 5.0 中增强循环
  6. python语言程序设计基础网课-宜昌2020年_高校邦_Python程序设计基础【实境编程】...
  7. python入门基础知识教程-Python基础知识入门,这三个原则是你要知道的,还有教程...
  8. python爬虫吧-python爬虫-爬取百度贴吧帖子加图片
  9. python测试开发自学教程-2019第一期《python测试开发》课程,10月13号开学
  10. python教程书籍-程序员大佬,给Python零基础入门书籍教程的一些建议!