Java8Stream流2
上期对stream流大致总结了一下,后面又做了一些练习,大家可以参考一下。
- 首先需要建一个 Product的实体类,后面会用到
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Product {
private Long id;
private Integer num;
private BigDecimal price;
private String name;
private String category;
}
- 下面是一些具体的案例
Product prod1 = new Product(1L, 1, new BigDecimal("15.5"), "面包", "零食");
Product prod2 = new Product(2L, 2, new BigDecimal("20"), "饼干", "零食");
Product prod3 = new Product(3L, 3, new BigDecimal("30"), "月饼", "零食");
Product prod4 = new Product(4L, 3, new BigDecimal("10"), "青岛啤酒", "啤酒");
Product prod5 = new Product(5L, 10, new BigDecimal("15"), "百威啤酒", "啤酒");
List<Product> proList = Lists.newArrayList(prod1,prod2,prod3,prod4,prod5);
@Test
public void testG(){
Map<String, List<Product>> proMap = proList.stream().collect(Collectors.groupingBy(Product::getCategory));
for(Map.Entry<String,List<Product>> entry : proMap.entrySet()){
System.out.println("key" + entry.getKey() + " value" + entry.getValue());
}
}
@Test
public void testCollect1(){
//求总数
Long sum = proList.stream().collect(Collectors.counting());
//求平均数量
Double averageNum = proList.stream().collect(Collectors.averagingInt(Product::getNum));
//求最高价格
Optional<BigDecimal> max = proList.stream()
.map(Product::getPrice)
.collect(Collectors.maxBy(BigDecimal::compareTo));
//求数量之和
Long collect = proList.stream().collect(Collectors.summingLong(Product::getNum));
//一次性统计所有信息
LongSummaryStatistics proLSS = proList.stream().collect(Collectors.summarizingLong(Product::getNum));
log.info("求总数:{}", sum);
log.info("求总求平均数量数:{}" ,averageNum);
log.info("求最高价格:{}" ,max.get());
log.info("求数量之和:{}" ,collect);
//System.out.println("求总数" + sum);
//System.out.println("求平均数量" + averageNum);
// System.out.println("求最高价格" + max);
// System.out.println("求数量之和" + collect);
System.out.println("一次性统计所有信息" + proLSS);
//将产品按数量是否大于5分区
Map<Boolean, List<Product>> partList = proList.stream().collect(Collectors.partitioningBy(n -> n.getNum() > 5));
log.info("按数量是否大于5分区:{}",partList);
//将产品按类别分组
Map<String, List<Product>> groupList = proList.stream().collect(Collectors.groupingBy(p -> p.getCategory()));
Map<String, List<Product>> groupList1 = proList.stream().collect(Collectors.groupingBy(Product::getCategory));
log.info("将产品按类别分组:{}",groupList);
log.info("将产品按类别分组:{}",groupList1);
}
@Test
public void testJoiningReducing(){
//将所有产品的 名称 拼接成一个字符串
String names = proList.stream().map(Product::getName).collect(Collectors.joining("_"));
log.info("所有产品名:{}",names);
List<String> strList = Arrays.asList("A", "B", "C", "D");
String strJoining = strList.stream().collect(Collectors.joining("+_+"));
log.info("字符串:{}",strJoining);
Integer collect = proList.stream().collect(Collectors.reducing(0, Product::getNum, (x, y) -> (x + y + 1)));
log.info("collect:{}",collect);
//stream中的reduce
Optional<Integer> reduce = proList.stream().map(Product::getNum).reduce(Integer::compare);
log.info("stream->reduce:{}",reduce.get());
}
@Test
public void testSorted1(){
//按 数量升序排列
List<Product> sortedList = proList.stream().sorted(Comparator.comparing(Product::getNum))
.collect(Collectors.toList());
log.info("sorted:{}",sortedList);
//按数量倒叙排
List<Product> sortedListReversed = proList.stream().sorted(Comparator.comparing(Product::getNum).reversed())
.collect(Collectors.toList());
log.info("sored.reversed:{}",sortedListReversed);
//先按数量排,再按价格排 (默认升序)
List<Product> collect = proList.stream().sorted(Comparator.comparing(Product::getNum).thenComparing(Product::getPrice))
.collect(Collectors.toList());
log.info("先按数量排,再按价格排 :{}",collect);
//先按数量排,再按价格排 (降序排)
List<Product> collect1 = proList.stream()
.sorted(Comparator.comparing(Product::getNum).thenComparing(Product::getPrice).reversed())
.collect(Collectors.toList());
log.info("先按数量排,再按价格降序排 :{}",collect1);
//先按数量排 再按价格 自定义排
List<Product> collect2 = proList.stream().sorted((p1, p2) -> {
if (p1.getNum() == p2.getNum()){
return p1.getPrice().compareTo(p2.getPrice()) ;
}else {
return p2.getNum() - p1.getNum();
}
}).collect(Collectors.toList());
log.info("先按数量排 再按价格 自定义排:{}",collect2);
}
//测试stream中reduce (规约 也成为缩减 是把一个流缩减成一个值 能实现对集合求和,求积 和求最值的操作)
@Test
public void testStreamReduce() {
//求商品 价格的总和 方式1
Optional<BigDecimal> sum = proList.stream().map(Product::getPrice)
.reduce((x, y) -> x.add(y));
log.info("求和:{}",sum.get());
//求商品 数量的总和 方式2
Optional<Integer> sum1 = proList.stream().map(Product::getNum)
.reduce(Integer::sum);
log.info("求和:{}",sum1.get());
//求商品 价格的总和 方式2
Optional<BigDecimal> sum2 = proList.stream().map(Product::getPrice)
.reduce(BigDecimal::add);
log.info("求和sum2:{}",sum2.get());
//求商品 价格的总和 方式3
BigDecimal sum3 = proList.stream().map(Product::getPrice)
.reduce(new BigDecimal("0"),BigDecimal::add);
log.info("求和sum3:{}",sum3);
//求乘积
Optional<Integer> product = proList.stream().map(Product::getNum).reduce((x, y) -> x * y);
log.info("乘积:{}",product);
//求最大值 方式 1
Optional<BigDecimal> maxPrice = proList.stream().map(Product::getPrice)
.reduce((x, y) -> x.compareTo(y) == 1 ? x : y);
log.info("商品价格的最大值:{}",maxPrice);
//求最大值 方式2
BigDecimal max2 = proList.stream().map(Product::getPrice)
.reduce(new BigDecimal(1), BigDecimal::max);
log.info("求 最大值 方式2:{}",max2);
}
Java8Stream流2的更多相关文章
- java8-Stream流API
一回顾与说明 经过前面发布的三章java8的博客,你就懂得了我们为什么要用Lamda表达式,Lamda表达式的原理与函数式接口的关系,从Lamda表达式到方法引用和构造引用. 想要学Stream流你必 ...
- 侠说java8--Stream流操作学习笔记,都在这里了
前言 首次接触到Stream的时候以为它是和InputStream.OutputStream这样的输入输出流的统称. 流和集合的前世今生 概念的差异 在开发中,我们使用最多的类库之一就是集合.集合是一 ...
- Java基础一篇过(七)Java8--stream流
一.简介 流(stream)也是Java8的一个重要的新特性,主要是对集合(Collector)功能的增强:在上一篇文章我们简单的了解了lambda表达式,现在我们学习下流的概念:使用流可以帮助我们做 ...
- java8中的stream流遍历
比较for循环.迭代器.java8Stream流遍历的不同 package cnom.test.testUtils; import java.io.Serializable; import java. ...
- java8-Stream之数值流
在Stream里元素都是对象,那么,当我们操作一个数字流的时候就不得不考虑一个问题,拆箱和装箱.虽然自动拆箱不需要我们处理,但依旧有隐含的成本在里面.Java8引入了3个原始类型特化流接口来解决这个问 ...
- 流式计算(一)-Java8Stream
大约各位看官君多少也听说了Storm/Spark/Flink,这些都是大数据流式处理框架.如果一条手机组装流水线上不同的人做不同的事,有的装电池,有的装屏幕,直到最后完成,这就是典型的流式处理.如果手 ...
- java8--stream
*:first-child { margin-top: 0 !important; } .markdown-body>*:last-child { margin-bottom: 0 !impor ...
- 流式计算(二)-Kafka Stream
前面说了Java8的流,这里还说流处理,既然是流,比如水流车流,肯定得有流的源头,源可以有多种,可以自建,也可以从应用端获取,今天就拿非常经典的Kafka做源头来说事,比如要来一套应用日志实时分析框架 ...
- 024:Java流实现Shell:cat 1.log | grep a | sort | uniq -c | sort -rn
本文阅读时间大约13分钟(本文实践性很强,建议pc端阅读,最好亲自实践). 参考答案 这个问题考察的是对Linux命令的熟悉程度,以及对Java中集合操作的综合运用,自从转到Java 8以后,我就一直 ...
- java8-Stream集合操作快速上手
java8-Stream集合操作快速上手 目录 Stream简介 为什么要使用Stream 实例数据源 Filter Map FlatMap Reduce Collect Optional 并发 ...
随机推荐
- disk磁盘分区软件使用教程,磁盘扩容无损备份
前几天,因为我的笔记本电脑C盘D盘全红了,趁着双11固态降价,赶紧买了一张三星980 500g 给我的拯救者插上了,加上原来的500g,总共1T,已经够用了. 不得不说拯救者系列预留的1个M.2固态插 ...
- JS学习笔记 (四) 数组进阶
1.基本知识 1.数组是值的有序集合.每个值叫做一个元素,而每个元素在数组中的位置称为索引,以数字表示,以0开始. 2.数组是无类型的.数组元素可以是任意类型,并且同一个数组中的不同元素也可能有不同的 ...
- 修改服务器ssh端口
最近,访问公司虚拟机都需要通过堡垒机才能访问了,觉得麻烦.要想不受该规则限制,也有办法,可以通过修改虚拟机ssh端口解决. 下面做个介绍. 1. 通过堡垒机登录虚拟机 2. 修改虚拟机ssh端口 编辑 ...
- webpack中 hash chunkhash
hash一般是结合CDN缓存来使用,通过webpack构建之后,生成对应文件名自动带上对应的MD5值.如果文件内容发生改变的话,那么对应文件hash值也会改变,对应的HTML引用的URL地址也会改变, ...
- Windows版CheatSheet——一键显示当前程序快捷键列表
Windows系统上的各种软件有太多的快捷键,想要记住是几乎不可能的,推荐一个一键显示当前软件快捷键的软件,在使用其他程序的时候,只要按下Ctrl+`就可以理解弹出该软件的所有快捷键列表,还支持收藏功 ...
- SolidWorks2020下载安装中文版教程,你solidworks安装失败是什么原因?
SW2020 WIN10 64位安装步骤: 1.先使用"百度网盘客户端"下载SW20S5_CN_x64安装包到电脑磁盘英文路径文件夹里,并鼠标右击进行解压缩,安装前先断开电脑网络, ...
- WINDOWS下对NIGNX日志文件进行限制
首先接到这个任务,发现nginx的日志限制更多的都是在Linux下做的,找了半天,也没找到能直接通过nginx.conf更改体现到日志限制上的. 最后决定直接通过bat脚本,来对nginx的日志进行分 ...
- Duplicate property mapping of xxx found in xx 嵌套异常,重复的属性在映射中发现。
该异常的原意是因为在映射文件中出现了两个一样的属性名: <property name="相同的属性名出现了两次以上" > <property name=" ...
- 【Java SE进阶】Day09 字节流、字符流、I/O操作、属性集
一.I/O概述 1.输入输出 输入:硬盘-->内存 输出:内存-->内存 2.流 字节流:一个字节等于8位 字符流:一个字符=2个字节 二.字节流 1.概述 以字节的方式读取/传输 可以读 ...
- Bootstrap响应式相关
bootstrap响应式布局实现原理:百分比布局+媒体查询 | 栅格系统 bootstrap和vue响应式布局的区别: 1. bootstrap 栅格系统,简,缺少组件 2. vue 速度快,组件多 ...