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遇到了在补充

java8 stream案例分析相关推荐

  1. 第2次作业:stream案例分析

    摘要:本次随笔是对stream软件进行一次案例分析,以个人观点分析stream为什么成功. 一.介绍产品相关信息 1.我选择的商品是stream 2.选择该产品的主要原因准要是因为自己本身喜欢玩这个平 ...

  2. Java:计算机编程语言Java的简介、安装(编程环境/工具)、学习路线(如何学习Java以及几十项代码编程案例分析)之详细攻略

    Java:计算机编程语言Java的简介.安装(编程环境/工具).学习路线(如何学习Java以及几十项代码编程案例分析)之详细攻略 目录 Java的简介 1.Java的工作原理--基于Eclipse等编 ...

  3. java8 Stream的实现原理 (从零开始实现一个stream流)

    1.Stream 流的介绍 1.1 java8 stream介绍 java8新增了stream流的特性,能够让用户以函数式的方式.更为简单的操纵集合等数据结构,并实现了用户无感知的并行计算. 1.2  ...

  4. java sort 效率_性能对比:collections.sort vs treeSet sort vs java8 stream.sorted

    0 写在前面的话 在项目中有一个排序问题,考虑到未来需要排序的数据量可能很大,想用一个性能较好的排序算法,现在有三套解决方法:jdk提供的集合的sort方法(Collections.sort).一个可 ...

  5. java双层list扁平化,浅谈java8 stream flatMap流的扁平化操作

    概念: Steam 是Java8 提出的一个新概念,不是输入输出的 Stream 流,而是一种用函数式编程方式在集合类上进行复杂操作的工具.简而言之,是以内部迭代的方式处理集合数据的操作,内部迭代可以 ...

  6. 基于ArcGIS:GIS空间分析复习-理论概念+案例分析

    目录 01 第一章 1.1 GIS空间分析的概念 1.2 GIS空间分析的研究对象.研究目标 1.3 研究目标是:认知.解释.预报.调控. 1.4 道路拓宽案例分析 1.5 GIS空间分析的核心问题 ...

  7. Java8 Stream:2万字20个实例,玩转集合的筛选、归约、分组、聚合

    Java8 Stream 1 Stream概述 2 Stream的创建 3 Stream的使用 案例使用的员工类 3.1 遍历/匹配(foreach/find/match) 3.2 筛选(filter ...

  8. 20个实例玩转Java8 Stream

    20个实例玩转Java8 Stream 20个实例玩转Java8 Stream Stream概述 Stream的创建 stream和parallelStream的简单区分 stream的使用 遍历/匹 ...

  9. java8 stream原理

    1.Stream 流的介绍 1.1 java8 stream介绍 java8新增了stream流的特性,能够让用户以函数式的方式.更为简单的操纵集合等数据结构,并实现了用户无感知的并行计算. 1.2  ...

最新文章

  1. curlopt_ssl_verifypeer后https还是验证不过_验证码识别竞赛解决方案(97%+一等奖)
  2. 006_Ajax发送POST请求
  3. 字节跳动面试题:“请你描述下 Spring Bean 的生命周期?”
  4. 在论坛中出现的比较难的sql问题:33(递归 连续日期问题 )
  5. Qt CMake变量参考
  6. 《JAVA与模式》之合成模式
  7. PHP代码优化的细节
  8. window.onload和$(document).ready(function(){})的区别
  9. CentOS中vsftp安装、配置、卸载
  10. VS2010对C++11的语法支持简单示例
  11. 史上首次无人车队集体婚礼,直男新郎给新娘の礼物:工业设计书
  12. android 自定义绘画,【整理】Android 自定义视图之画图
  13. 把块存放在页高速缓存中
  14. 怎么开发直播短视频源码?
  15. 单片机音频谱曲软件_单片机谱曲软件怎么弄 51单片机蜂鸣器电子琴程序
  16. html消息对话框,添加消息对话框 (HTML)
  17. 费马小定理 (证明)
  18. unity无光照着色器(顶点片元着色器)使用TAA抗锯齿后角色移动时模糊(虚影)解决方案
  19. java架构模式与设计模式(三)--事件风暴
  20. 计算机毕业设计Java印染公司信息管理系统(系统+程序+mysql数据库+Lw文档)

热门文章

  1. LeetCode之Sum of Left Leaves
  2. Android之解决java.lang.NoSuchMethodError:android.os.powerManager.isInteractive问题
  3. 深入 char * ,char ** ,char a[ ] ,char *a[]
  4. oracle 导库时日志满了,oracle rac 11g 日志占满系统盘导致数据库down掉
  5. 阿里云500服务器内部错误,腾讯云服务器网站不能打开 提示内部错误http 500
  6. python基本随机数生成函数有_Python中生成随机数的常用方法
  7. 我一哥们,在东莞和五名女孩被抓了.....
  8. java ready_Java PushbackReader ready()用法及代码示例
  9. mysql插入时间区间_mybatis插入数据时返回主键以及MySQL根据时间区间查询问题总结...
  10. navicat循环执行上下两行相减sql语句_SQL语句的优化分析