Stream流分组,统计,求和

public class Test {

public static void main(String[] args) {
List<OrdersDO> list = new ArrayList<>();//查询昨天一天的所有交易
OrdersDO o1 = new OrdersDO();
o1.setAppId(1L);
o1.setTradeAmount(100L);
o1.setStatus(1);
list.add(o1);
OrdersDO o2 = new OrdersDO();
o2.setAppId(5L);
o2.setTradeAmount(300L);
o2.setStatus(2);
list.add(o2);
OrdersDO o3 = new OrdersDO();
o3.setAppId(1L);
o3.setTradeAmount(100L);
o3.setStatus(3);
list.add(o3);
OrdersDO o4 = new OrdersDO();
o4.setAppId(5L);
o4.setTradeAmount(300L);
o4.setStatus(4);
list.add(o4);
OrdersDO o5 = new OrdersDO();
o5.setAppId(5L);
o5.setTradeAmount(300L);
o5.setStatus(4);
list.add(o5);
//统计每个应用实际支付总额
Map<Long, Long> tradeAmountMap = list.stream().filter(o->o.getStatus()==2)
.collect(Collectors.groupingBy(OrdersDO::getAppId,
Collectors.summingLong(OrdersDO::getTradeAmount)));
System.out.println(tradeAmountMap);

//统计每个应用取消总额
Map<Long, Long> cancelAmountMap = list.stream()
.collect(Collectors.groupingBy(OrdersDO::getAppId,
Collectors.summingLong(OrdersDO::getTradeAmount)));
System.out.println(cancelAmountMap);

//统计每个应用下交易笔数
Map<Long, Long> appTradeNum = list.stream().collect(Collectors.groupingBy(OrdersDO::getAppId, Collectors.counting()));
System.out.println(appTradeNum);

//统计每个应用每种状态下交易笔数
Map<Long, Map<Integer, Long>> tradeNumMap = list.stream().
collect(Collectors.groupingBy(OrdersDO::getAppId,
Collectors.groupingBy(OrdersDO::getStatus,
Collectors.counting())));
System.out.println(tradeNumMap);

//每个应用下交易笔数按数量排序
Map<Long,Long> finalMap = new LinkedHashMap<>();
appTradeNum.entrySet().stream().sorted(Map.Entry.<Long, Long>comparingByValue().reversed()).forEachOrdered(e->finalMap.put(e.getKey(),e.getValue()));
System.out.println(finalMap);
}
}

原文地址:https://www.cnblogs.com/tubashu/p/11994535.html

时间: 2024-10-30 05:08:38

Stream流分组,统计,求和的相关文章

java8 新特性 Stream流 分组 排序 过滤 多条件去重

private static List<User> list = new ArrayList<User>(); public static void main(String[] args) { list = Arrays.asList( new User(1, "a", 10), new User(4, "d", 19), new User(5, "e", 13), new User(2, "b", 1

awk 用数组实现分组统计求和

[[email protected] ~]# cat 2_awk.txt #txt文档有三列数据 1  A  1 2  B  2 3  C  1 4  D  1 5  E  3 6  A  2 7  B  1 8  C  2 9  D  3 [[email protected] ~]# cat 2_awk.txt|awk '{print $1,$2}' #打印第一列和第二列 1 A 2 B 3 C 4 D 5 E 6 A 7 B 8 C 9 D (1)统计ABCDE出现的次数 [[email p

010-jdk1.8版本新特性二-Optional类,Stream流

1.5.Optional类 1.定义 Optional 类是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象. Optional 是个容器:它可以保存类型T的值,或者仅仅保存null.Optional提供很多有用的方法,这样我们就不用显式进行空值检测. Optional 类的引入很好的解决空指针异常. 2.声明 以下是一个 java.util.Optional<T> 类的声明: public final class Option

乐字节-Java8新特性-接口默认方法之Stream流(下)

接上一篇:<Java8新特性之stream>,下面继续接着讲Stream 5.流的中间操作 常见的流的中间操作,归为以下三大类:筛选和切片流操作.元素映射操作.元素排序操作: 操作 描述 筛选和切片 filter(T -> boolean):保留 boolean 为 true 的元素 limit(long n):返回前 n 个元素 skip(long n):去除前 n 个元素 distinct():去除重复元素,这个方法是通过类的 equals 方法来判断两个元素是否相等的 映射 map

还看不懂同事的代码?超强的 Stream 流操作姿势还不学习一下

Java 8 新特性系列文章索引. Jdk14都要出了,还不能使用 Optional优雅的处理空指针? Jdk14 都要出了,Jdk8 的时间处理姿势还不了解一下? 还看不懂同事的代码?Lambda 表达式.函数接口了解一下 前言 我们都知道 Lambda 和 Stream 是 Java 8 的两大亮点功能,在前面的文章里已经介绍过 Lambda 相关知识,这次介绍下 Java 8 的 Stream 流操作.它完全不同于 java.io 包的 Input/Output Stream ,也不是大数

JAVA8学习——从使用角度深入Stream流(学习过程)

Stream 流 初识Stream流 简单认识一下Stream:Stream类中的官方介绍: /** * A sequence of elements supporting sequential and parallel aggregate * operations. The following example illustrates an aggregate operation using * {@link Stream} and {@link IntStream}: * * <pre>{@

Java8函数式编程(二):类比Spark RDD算子的Stream流操作

1 Stream流 对集合进行迭代时,可调用其iterator方法,返回一个iterator对象,之后便可以通过该iterator对象遍历集合中的元素,这被称为外部迭代(for循环本身正是封装了其的语法糖),其示意图如下: 除此之外,还有内部迭代方法,这正是这里要说明的集合的stream()方法返回的Stream对象的一系列操作,比如,要统计一个数字列表的偶数元素个数,当使用Stream对象的操作时,如下: List<Integer> list = new ArrayList<Integ

简洁方便的集合处理——Java 8 stream流

背景 java 8已经发行好几年了,前段时间java 12也已经问世,但平时的工作中,很多项目的环境还停留在java1.7中.而且java8的很多新特性都是革命性的,比如各种集合的优化.lambda表达式等,所以我们还是要去了解java8的魅力. 今天我们来学习java8的Stream,并不需要理论基础,直接可以上手去用. 我接触stream的原因,是我要搞一个用户收入消费的数据分析.起初的统计筛选分组都是打算用sql语言直接从mysql里得到结果来展现的.但在操作中我们发现这样频繁地访问数据库

Java8 Stream流使用及其基本原理

Stream流,是对集合对象操作的增强 基本使用 比如有一个Person类的集合:List<Person> personList,可以通过stream()对集合中的元素进行操作, 下面的操作流程可以归纳为 过滤-映射-收集. List<Integer> personIdList = personList.stream() //选出年龄大于20的Person对象 .filter(person -> person.getAge() > 20) //将Person对象映射成为