上期对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的更多相关文章

  1. java8-Stream流API

    一回顾与说明 经过前面发布的三章java8的博客,你就懂得了我们为什么要用Lamda表达式,Lamda表达式的原理与函数式接口的关系,从Lamda表达式到方法引用和构造引用. 想要学Stream流你必 ...

  2. 侠说java8--Stream流操作学习笔记,都在这里了

    前言 首次接触到Stream的时候以为它是和InputStream.OutputStream这样的输入输出流的统称. 流和集合的前世今生 概念的差异 在开发中,我们使用最多的类库之一就是集合.集合是一 ...

  3. Java基础一篇过(七)Java8--stream流

    一.简介 流(stream)也是Java8的一个重要的新特性,主要是对集合(Collector)功能的增强:在上一篇文章我们简单的了解了lambda表达式,现在我们学习下流的概念:使用流可以帮助我们做 ...

  4. java8中的stream流遍历

    比较for循环.迭代器.java8Stream流遍历的不同 package cnom.test.testUtils; import java.io.Serializable; import java. ...

  5. java8-Stream之数值流

    在Stream里元素都是对象,那么,当我们操作一个数字流的时候就不得不考虑一个问题,拆箱和装箱.虽然自动拆箱不需要我们处理,但依旧有隐含的成本在里面.Java8引入了3个原始类型特化流接口来解决这个问 ...

  6. 流式计算(一)-Java8Stream

    大约各位看官君多少也听说了Storm/Spark/Flink,这些都是大数据流式处理框架.如果一条手机组装流水线上不同的人做不同的事,有的装电池,有的装屏幕,直到最后完成,这就是典型的流式处理.如果手 ...

  7. java8--stream

    *:first-child { margin-top: 0 !important; } .markdown-body>*:last-child { margin-bottom: 0 !impor ...

  8. 流式计算(二)-Kafka Stream

    前面说了Java8的流,这里还说流处理,既然是流,比如水流车流,肯定得有流的源头,源可以有多种,可以自建,也可以从应用端获取,今天就拿非常经典的Kafka做源头来说事,比如要来一套应用日志实时分析框架 ...

  9. 024:Java流实现Shell:cat 1.log | grep a | sort | uniq -c | sort -rn

    本文阅读时间大约13分钟(本文实践性很强,建议pc端阅读,最好亲自实践). 参考答案 这个问题考察的是对Linux命令的熟悉程度,以及对Java中集合操作的综合运用,自从转到Java 8以后,我就一直 ...

  10. java8-Stream集合操作快速上手

    java8-Stream集合操作快速上手   目录 Stream简介 为什么要使用Stream 实例数据源 Filter Map FlatMap Reduce Collect Optional 并发 ...

随机推荐

  1. Spring Boot 应用的热部署配置

    前言 所谓热部署,简单来说,就是代码修改后不需重启项目就可自动加载出新的内容. 注意:热部署在 debug 调试模式下才生效! IDEA 配置 在 IDE(IDEA)中开启相关项目自动构建选项 开启编 ...

  2. android 代码分析

    1.@Override注解 @Override 注解是用来指定方法重写的,只能修饰方法并且只能用于方法重写,不能修饰其它的元素. 作用是告诉编译器检查这个方法,保证父类要包含一个被该方法重写的方法,否 ...

  3. Echarts - legend属性设置

    legend: { orient: 'horizontal', // 'vertical' x: 'right', // 'center' | 'left' | {number}, y: 'top', ...

  4. springboot滚动分页展示列表(类似layui瀑布流效果)

    背景: 公司项目要求获取用户关联的好友列表,要求分页查询,十条数据一页,滚动页面是点击加载更多,显示下一页列表. ​ 示例图: 实现: 本项目采用的前端模板是freemaker,主要前端页面代码(没有 ...

  5. 「Python实用秘技11」在Python中利用ItsDangerous快捷实现数据加密

    本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第11 ...

  6. 倍福Ads协议通信测试

    测试环境:vs2015 + TC31-Full-Setup.3.1.4022.30.exe 首先需要安装TC31-Full-Setup.3.1.4022.30.exe 本例子是用本机作测试,如果使用远 ...

  7. 5种GaussDB ETCD服务异常实例分析处理

    摘要:一文带你细数几种ETCD服务异常实例状态. 本文分享自华为云社区<[实例状态]GaussDB ETCD服务异常>,作者:酷哥 . 首先确认是否是虚拟机.网络故障 虚拟机故障导致ETC ...

  8. 面试官:介绍一下 Redis 三种集群模式

    小码今天去面试. 面试官:给我介绍一下Redis集群, 小码:啊,平时开发用的都是单机Redis,没怎么用过集群了. 面试官:好的,出门右转不谢. 小码内心困惑:在小公司业务量也不大,单机的 Redi ...

  9. .NET 6 实现滑动验证码(二)、基本数据

    上一节,介绍了滑动验证码的基本情况,也创建了一个.NET 6的工程.本节内容是创建一些基础类. 目录 CaptchaData.cs CaptchaValidateData.cs ImageCaptch ...

  10. C++使用ODBC连接数据库遇到的问题

    C++使用ODBC连接数据库遇到的问题 1.SQL语句中包含中文无法正常执行的问题 2.字符与宽字符相互转化的问题 C++使用ODBC连接数据库遇到的问题 1.SQL语句中包含中文无法正常执行的问题 ...