【JDK8新特性】Stream API 结合Lambda语法在项目中的实战应用

Lambda语法回顾

在JDK 8中,Lambda表达式支持的引用类型主要有以下几种,如表1所示。

种类

Lambda表达式示例

对应的引用示例

类名引用普通方法

(x,y,...)-> 对象名x.类普通方法名(y,...)

类名::类普通方法名

类名引用静态方法

(x,y,...) -> 类名.类静态方法名(x,y,...)

类名::类静态方法名

对象名引用方法

(x,y,...) -> 对象名.实例方法名(x,y,...)

对象名::实例方法名

构造器引用

(x,y,...) -> new 类名 (x,y,...)

类名::new

表1 Lambda表达式对普通方法和构造方法的引用形式

Stream语法回顾

关于为什么使用Stream接口

在开发中,多数情况下会涉及到对集合、数组中元素的操作,在JDK 8之前都是通过普通的循环遍历出每一个元素,然后还会穿插一些if条件语句选择性的对元素进行查找、过滤、修改等操作,这种原始的操作方法虽然可行,但是代码量较大并且执行效率较低。 

该接口可以将集合、数组的中的元素转换为Stream流的形式,并结合Lambda表达式的优势来进一步简化集合、数组中元素的查找、过滤、转换等操作,这一新功能就是JDK 8中的聚合操作。

Stream流的常用方法

方法声明

功能描述

Stream<T> filter(Predicate<? super T> predicate)

将指定流对象中的元素进行过滤,并返回一个子流对象

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

将流中的元素按规则映射到另一个流中

Stream<T> distinct()

删除流中重复的元素

Stream<T> sorted()

将流中的元素按自然顺序排序

Stream<T> limit(long maxSize)

截取流中元素的长度

Stream<T> skip(long n)

丢弃流中前n个元素

static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b)

将两个流对象合并为一个流

long count()

统计流中元素的个数

R collect(Collector<? super T, A, R> collector)

将流中的元素收集到一个容器中(如集合)

Object[] toArray()

将流中的元素收集到一个数组中

void forEach(Consumer<? super T> action)

将流中的元素进行遍历

表2 Stream流的常用方法 

在程序中,使用聚合操作没有绝对的语法规范,根据实际操作流程,主要可以分为以下3个步骤:

(1)将原始集合或者数组对象转换为Stream流对象;

● 所有的Collections集合都可以使用stream()静态方法获取Stream流对象;

● Stream接口的of()静态方法可以获取基本类型包装类数组、引用类型数组和单个元素的Stream流对象;

● Arrays数组工具类的stream()静态方法也可以获取数组元素的Stream流对象。

(2)对Stream流对象中的元素进行一系列的过滤、查找等中间操作(Intermediate Operations),然后仍然返回一个Stream流对象;

(3)对Stream流进行遍历、统计、收集等终结操作(Terminal Operation),获取想要的结果。一个Stream流对象可以连续进行多次中间操作,仍会返回一个流对象,但一个流对象只能进行一次终结操作,并且一旦进行终结操作后,该流对象就不复存在了。

小提示:

在JDK 8中,只针对单列集合Collections接口对象提供了stream()静态方法获取Stream流对象,并未对Map集合提供相关方法获取Stream流对象,所以想要用Map集合创建Stream流对象必须先通过Map集合的keySet()、values()、entrySet()等方法将Map集合转换为单列Set集合,然后再使用单列集合的stream()静态方法获取对应键、值集合的Stream流对象。

新特性在项目中的应用

  1. 从用户列表中根据用户相似度获取前num个用户ID并排序。 

     2. 将获取到的用户信息脱敏保存到finalUserList并且返回。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值