java8 stream案例分析

java8 stream

  • Stream是java8 推出的一个处理集合类的一个全新的接口,在工作当中经常用到,并且他的预发规则与我们平台的有一点不一样,是流式的处理,非常类似RXJava的一个风格。
  • java中对Stream的定义是:
A sequence of elements supporting sequential and parallel aggregate operations.
  • 以上的的语义包含两部分:

    • Stream是元素的集合,这点让Stream看起来有一些类似Iterator
    • 可以支持顺序和并行的对原Stream进行汇聚的操作
  • 刚学习Stream时候可以当一个高级的Iterator,原本的Iterator,用户只能逐个遍历每个元素,但是Stream用户只需要给出对其包含元素执行什么操作,也就是通过给Stream传递某一个的操作符或者方法,他会将集合中所有元素使用你给定的方法或者操作符进行修改。

  • 以下总结是我工作中用到的一些,会给出具体案例,初衷只是为了给自己一个参考,因为经常是在使用的时候,会忘记他的语法规则,或者忘记他的一些参数,以此作为一个记录。

  • 以下用到的基础对象:

/*** FM表Result*/
public class FmResult implements Serializable {public FmResult() {}public FmResult(Integer sortNo, String platform) {this.sortNo = sortNo;this.platform = platform;}/*** 序列化ID*/private static final long serialVersionUID = 7327233719573948963L;/*** 主键ID*/private Long id;/*** 排序值*/private Integer sortNo;/*** FM名称*/private String fmName;/*** 开放平台号,多个半角逗号隔开*/private String platform;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public Integer getSortNo() {return sortNo;}public void setSortNo(Integer sortNo) {this.sortNo = sortNo;}public String getFmName() {return fmName;}public void setFmName(String fmName) {this.fmName = fmName;}public String getPlatform() {return platform;}public void setPlatform(String platform) {this.platform = platform;}
}

Stream 流操作

/*** Stream 流操作** 类似Rxjava中的流操作* */public static void streamBuildList(){//stream 快速成成listList<Integer> ofList = Stream.of(1,2,3,4,5).collect(Collectors.toList());//安指定规律生成流List<Integer> iteraterList = Stream.iterate(1, (x) -> x+2).limit(100).collect(Collectors.toList());//生成随机数流List<Double> generateList = Stream.generate(Math::random).limit(199).collect(Collectors.toList());}

Stream 流元素操作

/*** Stream 流中间操作* distinct 更具hashCode,equals 反复去重* filter过滤* skip 跳过n个元素* limit获取n个元素* */public static void streamTest(){//生成随机数流List<Double> generateList = Stream.generate(Math::random).limit(199).collect(Collectors.toList());List<Double> myDubleLIst = generateList.stream().filter(d -> d > 0.5).distinct().skip(4).limit(20).collect(Collectors.toList());myDubleLIst.forEach(System.out::println);}

Stream map表达式映射

/*** Stream map表达式映射* */public static void testStreamMap(List<FmResult> list){//传递一个函数给map,他会映射到每一个元素上Set<String> resultlist = list.stream().map(result -> result.getPlatform().replace(",", "")).collect(Collectors.toSet());//复杂表达式处理List<FmResult> fmResults = list.stream().map( result -> {result.setPlatform(result.getPlatform().substring(0,1));return result;}).collect(Collectors.toList());}

Stream peek消费元素

/*** Stream peek消费元素* peek 和map操作一样,当peek接受的是一个Consumer 表达式没有返回值,map接受的是Function表达式有返回值* */public static void testStreamPeek(){FmResult result1 = new FmResult(1,"aa");FmResult result2 = new FmResult(2,"bb");FmResult result3 = new FmResult(3,"aa");FmResult result4 = new FmResult(4,"dd");List<FmResult> fmResults = Arrays.asList(result1,result2, result3, result4);List<FmResult> newResults = fmResults.stream().peek(result -> result.setFmName("123123")).collect(Collectors.toList());for (FmResult newResult: newResults) {System.out.println(newResult.getSortNo() + ": "+ newResult.getPlatform() + ": "+ newResult.getFmName());}}

Stream flatMapToInt,flatMapToDouble,flatMapToLong

/*** Stream flatMapToInt,flatMapToDouble,flatMapToLong* 一对多,将一个元素拆分成多个元素,流元素变多,map是一对一* */public static void testStreamFlagMap(){FmResult result1 = new FmResult(1,"aa");FmResult result2 = new FmResult(2,"bb");FmResult result3 = new FmResult(3,"aa");FmResult result4 = new FmResult(4,"dd");List<FmResult> fmResults = Arrays.asList(result1,result2, result3, result4);IntStream platformStream = fmResults.stream().map(FmResult::getPlatform).flatMapToInt(String::chars);int[] ints = platformStream.toArray();System.out.println(ints.length +"  :"+ ints[0]);}

Stream 流的终止操作

/*** Stream 流的终止*   allMatch:接收一个 Predicate 函数,当流中每个元素都符合该断言时才返回true,否则返回false*   noneMatch:接收一个 Predicate 函数,当流中每个元素都不符合该断言时才返回true,否则返回false*   anyMatch:接收一个 Predicate 函数,只要流中有一个元素满足该断言则返回true,否则返回false*   findFirst:返回流中第一个元素*   findAny:返回流中的任意元素*   count:返回流中元素的总个数*   max:返回流中元素最大值*   min:返回流中元素最小值* */public static void testStreamTermal(){List<String>  strList = Arrays.asList("a2","a1","b4","c1","d5","a6");boolean allMatch = strList.stream().allMatch(str -> str.equals("a1"));boolean noneMatch = strList.stream().noneMatch(str -> str.equals("x"));boolean anyMatch = strList.stream().anyMatch(str -> str.equals("a1"));String findFirst = strList.stream().findFirst().get();String findAny = strList.stream().findAny().get();Long count = strList.stream().count();String max = strList.stream().max(String::compareTo).get();String min = strList.stream().min(String::compareTo).get();}

Stream 排序处理

/*** Stream 排序处理* */public static void testStreamSort(){//String 自己已经实现了Compareable接口List<String>  strList = Arrays.asList("a2","a1","b4","c1","d5","a6");strList.stream().sorted().forEach(System.out::print);System.out.println();//自实现Compareable接口FmResult result1 = new FmResult(1,"aa");FmResult result2 = new FmResult(2,"bb");FmResult result3 = new FmResult(3,"aa");FmResult result4 = new FmResult(4,"dd");List<FmResult> fmResults = Arrays.asList(result1,result2, result3, result4);List<FmResult> sortResults = fmResults.stream().sorted((k1,k2)->{if(k1.getPlatform().equals(k2.getPlatform())){return k1.getSortNo()-k2.getSortNo();}else {return k1.getPlatform().compareTo(k2.getPlatform());}}).collect(Collectors.toList());for (FmResult sortResult : sortResults) {System.out.println(sortResult.getSortNo() + ": "+ sortResult.getPlatform());}}

Stream 表达式list 转 map

/*** Stream 表达式list -->map* (key1, key2) -> key1 作用在于如果存在相同id的数据,取第一个* */public static Map<Long, FmResult> streamListTOMap(List<FmResult> list){return list.stream().collect(Collectors.toMap(FmResult::getId, Function.identity(), (key1, key2) -> key1));}

Stream groupingBy分组

 /*** Stream 表达式 list --> map groupingBy分组* */public static void streamGroupingBy(List<FmResult> list){Map<String, List<FmResult>> fmMap = list.stream().collect(Collectors.groupingBy(FmResult::getPlatform));//按排平台分组,并返回数量Map<String, Long> fmCountMap = list.stream().collect(Collectors.groupingBy(FmResult::getPlatform, Collectors.counting()));}

Stream partitioningBy分区

/*** Stream partitioningBy分区* 按排序值 > 2 分组* */public static Map<Boolean, List<FmResult>> streamPartitioningBy(List<FmResult> list){return list.stream().collect(Collectors.partitioningBy(x -> x.getSortNo() > 2));}

Stream 连接 joining


/*** Stream 连接 joining* */public  static void streamJoining(){FmResult result1 = new FmResult(1,"aa");FmResult result2 = new FmResult(2,"bb");FmResult result3 = new FmResult(3,"aa");FmResult result4 = new FmResult(4,"dd");List<FmResult> fmResults = Arrays.asList(result1,result2, result3, result4);String platform = fmResults.stream().map(result -> result.getPlatform()).collect(Collectors.joining(","));System.out.println(platform);}

Stream 规约 reducing

 /*** Stream 规约 reducing* */public static void streamReducing(){FmResult result1 = new FmResult(1,"aa");FmResult result2 = new FmResult(2,"bb");FmResult result3 = new FmResult(3,"aa");FmResult result4 = new FmResult(4,"dd");List<FmResult> fmResults = Arrays.asList(result1,result2, result3, result4);Optional<Integer> sumSortNo = fmResults.stream().map(result ->result.getSortNo()).collect(Collectors.reducing(Integer::sum));System.out.println(sumSortNo.get());}

stream Collectors.averagingDouble()、Collectors.averagingInt()、Collectors.averagingLong() : 计算平均数

 /*** stream Collectors.averagingDouble()、Collectors.averagingInt()、Collectors.averagingLong() : 计算平均数* */public static void streamAveraging(){FmResult result1 = new FmResult(1,"aa");FmResult result2 = new FmResult(2,"bb");FmResult result3 = new FmResult(3,"aa");FmResult result4 = new FmResult(4,"dd");List<FmResult> fmResults = Arrays.asList(result1,result2, result3, result4);Double avgSortNo = fmResults.stream().collect(Collectors.averagingInt(FmResult::getSortNo));}

其他api遇到了在补充

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/310337.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[半翻] 设计面向DDD的微服务

这篇文章行文结构对照微软博客&#xff0c; 结合本人意译和多年实践的回顾性思考形成此次读书笔记。Domian-driven Design领域-驱动-设计&#xff08;DDD&#xff09;提倡基于(用例相关的现实业务)进行建模。1. DDD的视角DDD将现实问题视为领域;DDD将独立的问题描述为有界限的上…

数据结构与算法--数字在排序数组中出现次数

数字在排序数组中出现次数 题目&#xff1a;统计一个数字在一个排序数组中出现的次数。例如&#xff0c;输入数组{1,2&#xff0c;3&#xff0c;3,3&#xff0c;3,3&#xff0c;4,5} 和数字3&#xff0c;由于3 在数组中出现的次数是5&#xff0c;因此返回5 简单方案一 既然输…

【值得收藏】首次披露Facebook移动端软件的持续部署 | IDCF

&#xff08;图片来源于网络&#xff09;摘要持续部署是指软件更新一旦准备好就立即发布的实践方法&#xff0c;在业界越来越多地被采用。移动端软件的更新频率普遍落后于基于云端的服务&#xff0c;原因有很多。比如&#xff0c;移动端软件只能定期发布版本&#xff1b;用户可…

数据结构与算法--二叉树的深度问题

二叉树的深度 题目&#xff1a;输入一颗二叉树的根&#xff0c;求该树的深度。从根节点到叶子节点一次进过的节点形成的一条路径&#xff0c;最长的路径的长度为树的深度。如下图中二叉树的额深度4&#xff0c;因为从根节点A到叶子节点的路径中有4个节点A B E J 问题中定义了一…

进击谷歌:多线程下程序执行顺序怎么稳定不乱?

点击上方蓝字 关注我们面试官您好&#xff0c;我是来面试的您好&#xff0c;我是这次的面试官&#xff0c;先介绍一下自己把我是女孩&#xff0c;blala ....那问一个多线程的问题吧&#xff0c;在一个多线程的环境中&#xff0c;怎么能保证一系列方法的执行顺序呢&#xff1f;…

[Java基础]Set集合概述和特点

练习代码如下: package test21;import java.util.HashSet; import java.util.Set;public class SetDemo {public static void main(String[] args){Set<String> set new HashSet<String>();set.add("hello");set.add("world");set.add("…

深圳本次核酸检普筛怎么将个人信息和结果对应上??

前言 最近深圳疫情比较严重&#xff0c;好在上午新闻公布本次普筛都是阴性&#xff0c;期间我检查了三次&#xff0c;基本上每周测一次的样子&#xff0c;基本的检测非常快&#xff0c;只是需要筛查的人数太多&#xff0c;因此才有几公里的排队出现&#xff0c;期间也发现了一…

借助Redis完成延时任务

背景 相信我们或多或少的会遇到类似下面这样的需求&#xff1a;第三方给了一批数据给我们处理&#xff0c;我们处理好之后就通知他们处理结果。大概就是下面这个图说的。本来在处理完数据之后&#xff0c;我们就会马上把处理结果返回给对方&#xff0c;但是对方要求我们处理速度…

数据结构与算法--数组中出一次的数字

数组中出现一次的数字 题目&#xff1a;一个整型数组里面除了一个数字以外&#xff0c;其他数字都出现了两次。找出这个出现一次的数字&#xff0c;时间复杂度O(n)&#xff0c;空间复杂度O(1) 如上题中最简单的方法就是一次循环统计&#xff0c;之后在循环判断出值出现一次的数…

[Java基础]HashSet集合概述和特点

HashSet集合概述和特点: 练习代码如下: package HashSetPackage;import java.util.HashSet;public class HashSetDemo {public static void main(String[] args){HashSet<String> hs new HashSet<String>();hs.add("hello");hs.add("world")…

多亏我缓存技术过硬!疫情防控项目上线,我只用了5天!

先介绍下背景&#xff0c;我是武汉某O2O电商公司开发组长&#xff0c;疫情震中的我被老板要求7天之内上线《疫情防控热点图》项目&#xff0c;几个组员回老家断网&#xff0c;最终就2个人完成开发上线&#xff0c;满足了10w用户的高频访问。时间和人力都紧张&#xff0c;不能按…

数据结构与算法--有序数组中找出和为s的两个数字

有序数组中找和为s的两个数字 题目&#xff1a;输入一个递增排序的数组array&#xff0c; 和一个数字s&#xff0c; 在数组中找出两个数&#xff0c;使得这两个数的和是s&#xff0c;如果有多对&#xff0c;输出一对即可。 最简单方案 双循环&#xff0c;每次获取一个数据&a…

ABP框架使用拦截器动态配置租户过滤器

前言最近项目要求在ABP框架中根据TenantId是否为空来配置是否禁用租户过滤器。ABP自身给我我们禁用租户过滤器的两种方法官方文档https://aspnetboilerplate.com/Pages/Documents/Data-Filters方法一&#xff1a;使用工作单元using (_unitOfWorkManager.Current.DisableFilter(…

[Java基础]LinkedHashSet集合概述和特点

练习代码如下: package LinkedHashSetPack;import java.util.LinkedHashSet;public class LinkedHashSetDemo {public static void main(String[] args){LinkedHashSet<String> linkedHashSet new LinkedHashSet<String>();linkedHashSet.add("hello")…

数据结构与算法--翻转单词顺序

翻转单词顺序 题目&#xff1a;输入一个英文句子&#xff0c;翻转句子中的单词顺序&#xff0c;但是单词内的字符顺序不变&#xff0c;例如&#xff1a;I am a software engineer -> engineer software a am I 方案一&#xff1a;空间换时间 空间换时间方法&#xff0c;还…

在.NET Core中用最原生的方式读取Nacos的配置

背景 之前老黄写过一篇《ASP.NET Core结合Nacos来完成配置管理和服务发现》简单介绍了如何让.NET Core程序接入Nacos&#xff0c;之前的SDK里面更多的是对Nacos的Open API进行了封装以及对服务注册和发现的封装。配置这一块当时并没有过多的处理&#xff0c;用起来有时感觉不会…

[Java基础]TreeSet集合概述和特点

练习代码如下: package TreeSetPack;import java.util.TreeSet;public class TreeSetDemo {public static void main(String[] args){TreeSet<Integer> ts new TreeSet<Integer>();ts.add(10);ts.add(40);ts.add(30);ts.add(50);ts.add(20);ts.add(30);for (Inte…

数据结构与算法--判断扑克牌是否顺子

扑克牌的顺子 题目&#xff1a;从扑克牌中随机抽取N张牌&#xff0c;判断是否顺子&#xff0c;即这N张牌是不是连续的。扑克牌中2 ~ 10 为数字&#xff0c;11代表j&#xff0c;12代表k&#xff0c;13代表K&#xff0c;并且大小王可以代表任意数字。 抽象概念 将扑克牌抽象成计…