Java11已出,Java8已是主流。

现在来一波操作,应该不会太迟(T_T)

注:本文持续更新 ^_^

1. 前言

本文主要介绍Java8的2大主要新特性lambda表达式和Stream API,2者提供了更高层次的抽象,简化开发,提高生产效率。

2. Lambda表达式

2.1 初识Lambda表达式

创建一个线程,使用了一个Runnable匿名内部类

Thread thread = new Thread(new Runnable() {

@Override

public void run() {

System.out.println("Hello Aron.");

}

});

看着问题不大,实际上弊端挺明显:模板语法太多,真正有业务意义的的语句只有System.out.println("Hello Aron."),因为如此,也严重干扰了我们阅读代码。

引入lambda表达式后,则可以这么写

Thread thread = new Thread(() -> System.out.println("Hello Aron."));

简洁了太多,有木有?

2.2 更多Lambda表达式

Runnable runnable = () -> System.out.println("Hello World.");

Consumer tConsumer = bean -> System.out.println("Hello World.");

Runnable runnable1 = () -> {

System.out.println("Hello World.");

System.out.println("Hello World.");

};

语法分为3段式:参数 、-> 以及语句,即(...)-> { ...}

2.3 函数接口

Java是强类型语言,方法参数都有固定的类型。那么问题了,Lambda表达式,如果当做是一堆代码片段,也会表达一种明确的意图,这个意图,姑且可以理解为函数接口。

在编程过程中,总会遇到很多函数接口,以下是JDK中一些比较最重要的函数接口

接口参数返回类型示例

接口

参数

返回类型

示例

Predicate

T

boolean

值等于“Hello”吗?

Consumer

T

void

输出一个值

Function

T

R

获取对象的一个属性

Supplier

None

T

工厂方法

UnaryOperator

T

T

逻辑非(!)

BinaryOperator

(T, T)

T

求2个数的和(+)

2.4 类型推断

先看一段熟悉的集合代码

ArrayList list = new ArrayList<>();

在ArrayList中申明了存储的元素的类型,于是在ArrayList<>()这里的类型可以缺省,编译器可以根据左侧(即上文)推断出来。

同理,在lambda表达式也是一样的。

BinaryOperator addLongs = (x, y) -> x + y;

在上面的表达 式中,我们注意到 (x, y)这里是没有申明方法的参数类型的,却能执行数学运算 +。

这里根据函数接口指定的泛型类为Long,即可推断方法的参数为Long,然后执行x + y。

2.5 Lambda小结

Lambda表达式是一个匿名方法,简化了匿名内部类的写法,把模板语法屏蔽,突出业务语句,传达的更像一种行为。

Lambda表达式是有类型的,JDK内置了众多函数接口

Lambda的3段式结构:(...)-> { ...}

3. Stream 流

3.1 简介

流(Stream)是Java8的新特性,是一种使程序员得以站在更高的抽象层次上对集合进行操作。在思路上,类似于SQL的存储过程,有几个步骤:

先定义一些操作的集合,注意:这里只定义,不真正执行

触发执行,获取结果

对结果进一步处理,筛选、打印、使用

其中,第1步的定义操作叫惰性求值,给你套路(返回Stream),但是不会执行返回结果。

第2步的触发操作叫及早求值,这个人说干就干,立马要结果(返回结果数据)。

第3步的筛选类似SQL的where子句,对结果进一步的筛选。

3.2 Stream API

Stream 类位于java.util.stream包,是Java8核心的类之一,拥有众多方法,下面罗列了一些比较重要的方法进行讲解。更多的是抛砖引玉,任何教程都比不上自己的悟性来得爽快,先找点感觉,先掌握基本用法尝试使用起来,慢慢自然就会了。

3.2.1 Stream.of(T… t)

要使用Stream,那就必须得先创建一个String类型的Stream

Stream StrStream = Stream.of("a", "b");

3.2.2 Stream.collect(Collector super T, A, R> collector)

使用收集器Collector将StrStream转化为熟悉的集合Collection

List collect = StrStream.collect(Collectors.toList());

3.2.2 Stream.map(Function super T, ? extends R> mapper)

所谓map,从字面理解就是映射。这里指的是对象关系的映射,

比如从对象集合映射到属性结合:

List names = Stream.of(new Student("zhangSan"), new Student("liSi"))

.map(student -> student.getName())

.collect(toList());

从小写字母映射到大写字母:

List collected = Stream.of("a", "b", "hello")

.map(string -> string.toUpperCase())

.collect(toList());

将 字符串流 根据空格分割成 字符串数组流

Stream stringStream = Stream.of("Hello Aron.");

Stream stringArrayStream = stringStream.map(word -> word.split(" "));

3.2.3 Stream.filter(Predicate super T> predicate)

filter顾名思义,过滤筛选。这里的参数函数接口是一个条件,筛选出满足条件的元素

// 筛选年龄大于19的学生

List stu = Stream.of(new Student("zhangSan", 19), new Student("liSi"), 20)

.filter(student -> student.getAge() > 19)

.collect(toList());

3.2.4 Stream.flatMap(Function super T, ? extends Stream extends R>> mapper)

flatMap扁平化映射,即将数据元素为数组的Stream转化为单个元素

Stream stringStream = Stream.of("Hello Aron.");

// 返回值为数组

Stream stringArrayStream = stringStream.map(word -> word.split(" "));

// flatMap扁平化映射后,元素都合并了

Stream flatResult = stringArrayStream.flatMap(arr -> Arrays.stream(arr))

3.2.5 Stream.max(Comparator super T> comparator)

max即最大,类似SQL中的函数max(),从数据中根据一定的条件筛选出最值

// 筛选年龄最大/小的学生

Stream studentStream = Stream.of(new Student("zhangSam", 19), new Student("liSi", 20));

Optional max = studentStream.max(Comparator.comparing(student -> student.getAge()));

// Optional max = studentStream.min(Comparator.comparing(student -> student.getAge()));

// 年龄最大/小的学生

Student student = max.get();

3.2.7 Sream.reduce(T identity, BinaryOperator binaryOperator)

reduce操作实现从一组值中生成一个值,上面的max、min实际上都是reduce操作。

参数Identity 表示初始值,

参数binaryOperator是一个函数接口,表示二元操作,可用于数学运算

// 使用reduce() 求和 (不推荐生产环境使用)

int count = Stream.of(1, 2, 3).reduce(0, (acc, element) -> acc + element);

上面代码,展开reduce() 操作

BinaryOperator accumulator = (acc, element) -> acc + element;

int count = accumulator.apply( accumulator.apply(accumulator.apply(0, 1),2), 3);

3.2.8 综合操作

// 查找所有姓张的同学并按字典顺序排序,存储到list

List newList = studentList.Stream()

.filter(student -> student.getName().startsWith("张"))

.sorted(Comparator.comparing(student -> student.getName())

.collect(toList());

觉得有用,记得收藏、点赞哦!

java lambda collect_45分钟学会Java8 - Lambda和Stream相关推荐

  1. C#中的委托和Java中的“委托”(Java8 lambda表达式)

    Java8中新增了有关对lambda表达式的支持,其本质是一种编译阶段的语法糖,效果是双向的,代码看似简洁的前提下牺牲了部分可读性. 我们可以尝试实现一些有意思的东西,先来看段C#委托(delegat ...

  2. 【Java】3分钟学会Java中基本数据类型(建议收藏)

  3. java suggest_一分钟学会实现Suggest功能的AJAX样例 | 学步园

    Ajax不是什么新鲜的技术,微软98年出的MSDN里面,就介绍了msxml,xmlhttpreuqest的远程读取xml文档的功能.只不过那个时候B/S技术远没有今天这么热,所以ajax被翻出来换了个 ...

  4. 【Java学习笔记之三十一】详解Java8 lambda表达式

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

  5. java compare 返回值_关于Java你不知道的那些事之Java8新特性[Lambda表达式和函数式接口]...

    前言 为什么要用Lambda表达式? Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码,将代码像数据一样传递,这样可以写出更简洁.更灵活的代码,作为一个更紧凑的代码风 ...

  6. 深入学习Java8 Lambda (default method, lambda, function reference, java.util.function 包)

    Java 8 Lambda .MethodReference.function包 多年前,学校讲述C#时,就已经知道有Lambda,也惊喜于它的方便,将函数式编程方式和面向对象式编程基于一身.此外在使 ...

  7. java8 lambda map排序_Android兼容Java 8语法特性的原理分析

    本文主要阐述了Lambda表达式及其底层实现(invokedynamic指令)的原理.Android第三方插件RetroLambda对其的支持过程.Android官方最新的dex编译器D8对其的编译支 ...

  8. lambda 对象去重_采用java8 lambda表达式 实现 java list 交集 并集 差集 去重复并集...

    采用java8 lambda表达式 实现java list 交集/并集/差集/去重并集 一般的javaList 交.并集采用简单的 removeAll retainAll 等操作,不过这也破坏了原始的 ...

  9. lambda学习视频和stream学习视频(Java8 Lambda表达式视频教程)-Java爬虫-网络购物的正确打开方式

    百度网盘 链接:https://pan.baidu.com/s/1upU5EVXOQeho6poDYdnhiQ 提取码:088l Java8 Lambda表达式视频教程 https://www.bil ...

最新文章

  1. chakra linux安装教程,Chakra Linux 安装指南(二):Chakra Linux 安装
  2. 德国汽车产业研究:立足本土,迈向世界
  3. Struts2三种传参方式(从jsp页面传到Action)
  4. 人脸检测的harr检测函数
  5. 浪潮as5300技术方案_浪潮智能存储AS5300G2双活解决方案
  6. java学习(1):学生管理系统1
  7. webhooks_在本地开发时如何测试Webhooks
  8. armbian ubuntu 桌面_Armbian国内源(Ubuntu18.04 Bionic)
  9. Java进阶之路——从初级程序员到架构师,从小工到专家(转)
  10. 前端实现炫酷动效_10大炫酷的HTML5文字动画特效欣赏
  11. 灵悟礼品网上专卖店——第三阶段Sprint
  12. java语言飞机大战代码_飞机大战JAVA代码
  13. 沉痛悼念游戏开发技术专家毛星云
  14. java两个日期相减_java将两个日期相减得到天数
  15. 鸿蒙大陆罪恶深渊哪里出,库库马力
  16. dnf第七章waiguaⅢ∨dnf第七章好感度【=dnf第七章免费外挂
  17. Linux C编程 —— 通过文件描述符获得文件路径
  18. 公司 邮件 翻译 培训 长难句 13
  19. DDOS防御----CENTOS 内核TCP参数优化
  20. javase_20(Awt初步认识)

热门文章

  1. 嵌入式系统 Boot Loader 技术内幕-目前看到介绍Boot loader最通俗明了的文章
  2. 为了云,阿里、腾讯和百度一年花了多少钱?
  3. C/C++返回内部静态成员的陷阱
  4. 【Cocos2d-X(2.x) 游戏开发系列之三】最新版本cocos2d-2.0-x-2.0.2使用资源加载策略
  5. HDFS 常用操作分类汇总整理
  6. YARN配置Kerberos认证
  7. 【BZOJ】1031: [JSOI2007]字符加密Cipher(后缀数组)
  8. 安全现状:从通杀到专杀
  9. linux服务器secureCRT RSA登录配置
  10. Everyday a English