「java8」阿里架构师:Stream对集合的处理方式你全都知道了吗?

一、概述

Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API来并行执行操作。简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式。

特点:

  • 元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。
  • 数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。
  • 聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。
  • Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( short-circuiting)。
  • 内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现。

二、Stream的创建

Stream可以通过集合数组创建。

1、通过 java.util.Collection.stream() 方法用集合创建流

List list = Arrays.asList(1, 2, 3);// 创建一个顺序流Stream stream = list.stream();// 创建一个并行流Stream parallelStream = list.parallelStream();

2、使用java.util.Arrays.stream(T[] array)方法用数组创建流

int[] array={1,3,5,6,8};IntStream stream = Arrays.stream(array);

3、使用Stream的静态方法:of()、iterate()、generate()(我不是很常用)

Stream stream = Stream.of(1, 2, 3);// of内部的方法,等同于使用数组创建流@SafeVarargs@SuppressWarnings(“varargs”) // Creating a stream from an array is safepublic static Stream of(T… values) {return Arrays.stream(values);}Stream stream2 = Stream.iterate(0, (x) -> x + 3).limit(4);stream2.forEach(System.out::print);System.out.println();Stream stream3 = Stream.generate(Math::random).limit(3);stream3.forEach(System.out::println);

输出结果:

03690.49189549200548930.82466382643695550.17880449237798712

将对象集合转成对象中某个属性的集合

List list = new ArrayList();List ids = list.stream().map(ReviewerRest::getId).collect(Collectors.toList());复制代码

将某个属性的集合转成对象集合

List ids = new ArrayList();List list = ids.stream().map(id -> {ReviewerRest rest = new ReviewerRest();rest.setRest(1);rest.setDate(LocalDate.now());rest.setReviewerId(1000L);return rest;}).collect(Collectors.toList());复制代码

判断集合中是否有一个对象包含某个属性

boolean exist = list.stream().anyMatch(rest -> rest.getReviewerId().equals(1000L));//…… allMatch 和 anyMatch 类似复制代码

对集合中某个对象的属性求和

BigDecimal reduce = list.stream().map(ReviewerRest::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add);复制代码

集合转 Map (普通)

Map map = list.stream().collect(Collectors.toMap(ReviewerRest::getId, x -> x));复制代码

集合转 Map (key 存在重复)

当集合中 id 会存在重复时,上面那种方式会报错,此时需要指定重复时选用哪一个 value

Map map = list.stream().collect(Collectors.toMap(ReviewerRest::getId, x -> x, (before, after) -> after));复制代码

集合转 Map (value 存在 null 值)

当 value 存在 null 值时上面那种方式会报错,此时需要换一种写法

Map map = list.stream().collect(HashMap::new, (mapItem, item) -> mapItem.put(item.getId(), item.getDate()), HashMap::putAll);复制代码

集合分组 转 Map

Map map = list.stream().collect(Collectors.groupingBy(ReviewerRest::getId));复制代码

集合分区 转 Map

Map map = list.stream().collect(Collectors.partitioningBy(r -> r.getRest() == 1));复制代码

集合分组个数统计

Map map = list.stream().collect(Collectors.groupingBy(ReviewerRest::getId,Collectors.counting()));复制代码

集合分组转某个属性集合

Map map = list.stream().collect(Collectors.groupingBy(ReviewerRest::getId,Collectors.mapping(ReviewerRest::getRest,Collectors.toList())));复制代码

集合分组聚合查询最大元素

Map map = list.stream().collect(Collectors.groupingBy(ReviewerRest::getReviewerId, Collectors.maxBy(Comparator.comparing(ReviewerRest::getDate))));复制代码

集合分组聚合求和

//目前只支持 int、double、longMap map = list.stream().collect(Collectors.groupingBy(ReviewerRest::getReviewerId, Collectors.summingLong(

java8采用stream对集合的常用操作

User :{id,name,age}

1.对象集合的分组(有两种形式)示例:List userList,根据id分组,可以分组成为两种格式的map(1)Map

Map map = userList.stream().collect(Collectors.toMap(User::getId, Function.identity()));

(2)Map

Map = userList.stream().collect(Collectors.groupingBy(User::getId));

2.去重操作对List 实现去重,distinct关键字

示例:userList= userList.stream().distinct().collect(Collectors.toList());

3.stream的map主要用于得到特定的结构例如:List userList,我向得到User Id的集合

List idList = userList.stream.map(User::getId).collect(Collectors.toList());

4.stream的filter主要用于数据的筛选。例1:一个条件的筛选,删选id>5的User

List userList = userList.stream.filter(i->i.getId()>5).collect(Collectors.toList());

例2:两个条件的删选用&&连接就行,删选id>5年纪>10的User

List userList = userList.stream.filter(i->i.getId()>5&&i.getAge()>10).collect(Collectors.toList());

5.用来作循环

userList.stream().forEach(user -> System.out.println(“姓名:” + user.getName()));

当然也可以加个limit限制数量

userList.stream().limit(2).forEach(user -> System.out.println(“姓名:” + user.getName()));

6.最大值最小值

int maxAge = userList.stream().mapToInt(User::getAge).max().getAsInt(); int minAge = userList.stream().mapToInt(User::getAge).min().getAsInt();

封装的Stream使用类,可以直接拿走使用:

public class StreamUtils {/** * 集合为空,创建空的Stream流;否则创建集合的Stream流 * 避免出现空指针 * * @param collection 集合 * @param集合元素的泛型 * @return Stream对象 */private staticStream streamOf(Collection collection) {return CollectionUtils.isEmpty(collection) ? Stream.empty() : collection.stream();}/** * 按照映射规则映射成一个新的集合流 * * @param list集合 * @param mapper 集合属性元素 * @param函数输入类型的泛型 * @param函数结果类型的泛型 * @return新的集合 */public staticList mapList(List list, Function mapper) {return streamOf(list).map(mapper).collect(Collectors.toList());}/** * 根据给定的条件进行筛选,将符合条件的元素提取成新的流 * * @param list集合 * @param predicate 筛选规则 * @param流元素的类型 * @return符合条件的流集合 */public staticList filter(List list, Predicate predicate) {return streamOf(list).filter(predicate).collect(Collectors.toList());}/** * 根据给定的条件进行筛选,将符合条件的元素提取成新的流 * * @param list集合 * @param predicates多个筛选条件 * @param流元素的类型 * @return 符合条件的流集合 */@SafeVarargspublic staticList filters(List list, Predicate … predicates) {Stream stream = streamOf(list);for (Predicate predicate : predicates) {stream = stream.filter(predicate);}return stream.collect(Collectors.toList());}/** * 根据指定元素对集合进行升序排序 * * @param list集合 * @param keyExtractor用来排序的元素 * @param函数输入类型的泛型 * @param函数结果类型的泛型 * @return排序后的集合 */public static List sorted(List list, Function keyExtractor) {return streamOf(list).sorted(Comparator.comparing(keyExtractor)).collect(Collectors.toList());}/** * 根据指定元素对集合进行升序排序 * * @param list集合 * @param keyExtractor用来排序的元素 * @param limit 排序后集合中保留的数量 * @param函数输入类型的泛型 * @param函数结果类型的泛型 * @return排序后的集合 */public static List sorted(List list, Function keyExtractor, Integer limit) {return streamOf(list).sorted(Comparator.comparing(keyExtractor)).limit(limit).collect(Collectors.toList());}/** * 根据指定元素对集合进行降序排序 * * @param list集合 * @param keyExtractor用来排序的元素 * @param函数输入类型的泛型 * @param函数结果类型的泛型 * @return排序后的集合 */public static List sortedDesc(List list, Function keyExtractor) {return streamOf(list).sorted(Comparator.comparing(keyExtractor).reversed()).collect(Collectors.toList());}/** *根据规则判断元素是否匹配 * * @param list集合 * @param predicate 匹配规则 * @param元素类型 * @return匹配结果 */public staticboolean anyMatch(List list, Predicate predicate) {return streamOf(list).anyMatch(predicate);}/** * 将List集合转换成Map集合,同一个key时对value进行去重,保留第一个出现的value值 * * @param list集合 * @param keyMapper 新的Map中的key * @param参数的类型 * @return转换后的Map集合*/public staticMap toMapDistinctFirst(List list, Function keyMapper) {return streamOf(list).collect(Collectors.toMap(keyMapper, Function.identity(), (key1, key2) -> key1));}/** * 将List集合转换成Map集合,同一个key时对value进行去重,保留最后出现的value值 * * @param list集合 * @param keyMapper 新的Map中的key * @param参数的类型 * @return转换后的Map集合*/public staticMap toMapDistinctLast(List list, Function keyMapper) {return streamOf(list).collect(Collectors.toMap(keyMapper, Function.identity(), (key1, key2) -> key2));}/** * 将List转换为指定key->value键值对元素的Map集合 * @param list集合 * @param keyMapper Map的key元素 * @param valueMapper Map的value元素 * @param函数输入的类型 * @param函数输出的类型 * @param函数输出的类型 * @return转换后的Map集合*/public staticMap toMap(List list, Function keyMapper,Function valueMapper) {return streamOf(list).collect(Collectors.toMap(keyMapper, valueMapper));}}

最后希望大家能从文章中得到帮助获得收获,也可以评论出你想看哪方面的技术。文章会持续更新,希望能帮助到大家,哪怕是让你灵光一现。喜欢的朋友可以点点赞和关注,也可以分享出去让更多的人看见,一起努力一起进步!

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
用户投稿
上一篇 2022年9月20日 06:12
下一篇 2022年9月20日 06:13

相关推荐

  • 存储过程语法(sql server存储过程语法)

    今天小编给各位分享存储过程语法的知识,其中也会对sql server存储过程语法进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧! oracle存储过程基本语法…

    2022年11月26日
  • 《原神》3.2无相交响诗第一天无相之冰怎么打?无相交响诗攻略

    原神3.2无相交响诗第一天无相之冰怎么打?最近新版本3.2版本的无相交响诗活动又开启了,不少玩家还不清楚具体的玩法,下面一起来看一下原神被隐去的原神3.2无相交响诗第一天无相之冰打…

    2022年11月24日
  • 《原神》画外旅照青植之篇第七天怎么过?画外旅照第七天玩法介绍

    原神的画外旅照任务需要玩家达成一定的要求进行拍照,完成任务可以获得奖励。很多玩家想知道原神画外旅照青植之篇第七天怎么过,下面就带来原神画外旅照第七天玩法介绍,感兴趣的小伙伴不要错过…

    2022年11月23日
  • 京东店铺类型有哪些京东入驻有什么资质要求

    今天的互联网发展迅速,让传统企业有了更多选择,但也同样也对刚触网的商家增添了许多迷茫,近日知舟电商就收到很多商家朋友询问京东入驻相关问题,今天知舟君就给大家分享下。 一.京东入驻准…

    2022年11月18日
  • 我的世界交错次元水蓝元素宝石怎么获得?黑暗沼泽水蓝元素宝石获得方法

    我的世界交错次元水蓝元素宝石怎么获得?我的世界交错次元水蓝元素宝石获取方法是什么?很多玩家不知道,交错次元mod有很多道具跟装备都需要技巧获得,水蓝元素宝石用消耗净化器中存储的1桶…

    2022年11月17日
  • 原神渌华池之影拍照位置攻略 画外旅照青植第一天通关技巧

    原神渌华池之影拍照是很多玩家关心的,这个是画外旅照青植第一天的拍摄主题。因此想要知道这个过关攻略是什么的小伙伴们,其实这个操作方法还是很容易的,想要知道的小伙伴们,就一起来看看吧。…

    2022年11月17日
  • 原神画外旅照病师怎么拍照 病师留影攻略

    原神画外旅照活动正在进行中,第一张照片的命题是病师,玩家根据描述前往指定地方拍照完成任务,那原神画外旅照病师怎么拍照, 小编为大家带来病师留影攻略。 原神画外旅照病师怎么拍照 第一…

    2022年11月17日
  • 怎么删除自己的追评(淘宝追评可以删除吗)

    一、淘宝店铺每个评价类型的处理方案都是不同的,那具体哪些评价类型该如何区分呢? 1、主评为好评时:不支持修改或者删除评价的,若中评/差评改为好评,也不可修改或删除 ; 2、当主评为…

    2022年11月17日
  • 排名前十的小说(排名前十的小说完结)

    本文主要讲的是排名前十的小说,以及和排名前十的小说完结相关的知识,如果觉得本文对您有所帮助,不要忘了将本文分享给朋友。 小说排行榜2022前十名完结(十大必看网络小说排行榜每本都是…

    2022年11月14日
  • 稀土是什么(稀土是什么样子图片)

    稀土是一组金属的简称,包括化学元素周期表第三副族中称为镧系元素的镧铈镨钕钷钐铕钆铽镝钬铒铥镱镥,以及性质与其相近的钪和钇从1794年发现元素钇,到1992年发现自然界中的稀土元素;…

    2022年11月10日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息