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 并发 ...
随机推荐
- 论文笔记 - Fantastically Ordered Prompts and Where to Find Them: Overcoming Few-Shot Prompt Order Sensitivity
prompt 的影响因素 Motivation Prompt 中 Example 的排列顺序对模型性能有较大影响(即使已经校准参见好的情况下,选取不同的排列顺序依然会有很大的方差): 校准可以大幅度提 ...
- Atcoder beginner contest 249 C-Just K(二进制枚举)
题目大意:给你N个字符串,你可以从中选择任意数量的字符串,请统计在你的字串中,相同字母出现次数正好为K次的字母数.数据保证出现的字母都是小写字母. 1≤N≤15 1 ≤K≤N 一开始读题的时候读错了, ...
- Jmeter——请求响应内容乱码解决办法
前段时间,换过一次设备,重新下载了Jmeter.有一次在编写脚本时,响应内容中的中文一直显示乱码. 遇到乱码不要慌,肯定是有办法来解决的.具体解决办法,可以参考之前的博文,Jmeter--BeanSh ...
- perl 通过<<和文件句柄将数据写入到文件中去
可以通过文件句柄和<<运算符将文件内容写入到文件中去 #!usr/bin/perl -W use strict; use Spreadsheet::ParseExcel; use utf8 ...
- 小程序基础之引用vant组件库
第一步:终端npm init -y 会生成一个pack.json文件.(初始化包管理,记录这个项目用的包.) 第二步:npm install 会生成一个 package-lock.json文件.(一个 ...
- Window10开机键盘映射
一.映射工具 1.github地址 https://github.com/susam/uncap 2.映射方式 (1)CapsLock映射成ESC键 uncap 0x1b:0x14 (2)CapsLo ...
- 基于python的数学建模---pulp库
instance 代码: import pulp z = [2, 3, 1] a = [[1, 4, 2], [3, 2, 0]] b = [8, 6] aeq = [[1,2,4]] beq = [ ...
- springboot接收前端传参的几种方式
1.通过HttpServletRequest接收,常用于获取请求头参数以及Cookie,适用于GET 和 POST请求方式,以下两种方式: @GetMapping("/demo1" ...
- 关于 python3 中的多线程的问题及理解
什么是 join() ? join() 有什么用? 答:join() 有一个参数是timeout 设置超时,这里的超时都是针对主线程的,当子线程设置为 join(1) 后,则主线程会等待这个线程 1 ...
- 【Java SE】Day08 String类、static关键字、Arrays类、Math类
一.String类 1.概述 所有双引号字符串,都是String类的对象 字符串常量,会存在字符串常量池中 2.创建 构造函数--空构造.字符数组.字节(byte ASCII码)数组 3.常用方法-- ...