package com.example.apidemo.jdk18;

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.apache.commons.lang3.tuple.MutablePair; /**
* @Author Tim
* @Date 2021/12/17 16:24
*/
public class GroupBy { public static void main(String[] args) { //Java 8允许在接口中加入具体方法。接口中的具体方法有两种,default方法和static方法,identity()就是Function接口的一个静态方法。
//Function.identity()返回一个输出跟输入一样的Lambda表达式对象,等价于形如t -> t形式的Lambda表达式 //按输入类型,统计分组数量
List<String> items = Arrays.asList("apple", "apple", "banana","apple", "orange", "banana", "papaya");
Map<String, Long> result = items.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
System.out.println("result===" +result); //按输入类型,统计分组--排序
Map<String, List<String>> result2 = items.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.toList()));
System.out.println("result2===" +result2); // result 排序
Map<String, Long> finalMap = new LinkedHashMap<>();
result.entrySet().stream().sorted(Map.Entry.<String, Long>comparingByValue().reversed())
.forEachOrdered(e -> finalMap.put(e.getKey(), e.getValue()));
System.out.println("finalMap===" + finalMap); List<User> users = Arrays.asList(
new User("apple", 10, new BigDecimal(23)),
new User("apple", 20, new BigDecimal(32)), new User("orange", 30, new BigDecimal(13)),
new User("orange", 20, new BigDecimal(33)),
new User("orange", 10, new BigDecimal(63)), new User("peach", 20, new BigDecimal(26)),
new User("peach", 30, new BigDecimal(42)),
new User("peach", 40, new BigDecimal(24)),
new User("peach", 10, new BigDecimal(12))
); // 按照name分组,并求出个数
Map<String, Long> counting = users.stream().collect(Collectors.groupingBy(User::getName, Collectors.counting()));
System.out.println("counting===="+counting); // 按照name分组,求和
Map<String, Integer> sum = users.stream().collect(Collectors.groupingBy(User::getName, Collectors.summingInt(User::getQty)));
System.out.println("sum===="+sum); int basePoint3 = users.stream().filter(user -> user.getName().equals("orange")).mapToInt(User::getQty).sum();
System.out.println("basePoint3===="+ basePoint3); System.out.println("================================================================="); // 按照name分组 转化List->Set,并且只取 getName作为新的list。
Map<Integer, List<String>> result_list = users.stream()
.collect(Collectors.groupingBy(User::getQty, Collectors.mapping(User::getName, Collectors.toList())));
System.out.println("result_list===="+ result_list); Map<String, Set<User>> result_set = users.stream()
.collect(Collectors.groupingBy(User::getName, Collectors.toSet()));
System.out.println("result_set===="+ result_set); //按照name分组,可以简写,不需要,Collectors.toList()
Map<String, List<User>> groupByPriceMap = users.stream().collect(Collectors.groupingBy(User::getName));
System.out.println("groupByPriceMap===="+ groupByPriceMap);
} }
package com.example.apidemo.jdk18;

import java.math.BigDecimal;

public class User {

    private String name;

    private int qty;

    private BigDecimal price;

    public User() {
} public User(String name, int qty, BigDecimal price) {
this.name = name;
this.qty = qty;
this.price = price;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getQty() {
return qty;
} public void setQty(int qty) {
this.qty = qty;
} public BigDecimal getPrice() {
return price;
} public void setPrice(BigDecimal price) {
this.price = price;
} @Override
public String toString() {
return "Item{" +
"name='" + name + '\'' +
", qty=" + qty +
", price=" + price +
'}';
}
}

jdk1.8:stream流式分组groupby的更多相关文章

  1. Java的Stream流式操作

    前言 最近在实习,在公司看到前辈的一些代码,发现有很多值得我学习的地方,其中有一部分就是对集合使用Stream流式操作,觉得很优美且方便.所以学习一下Stream流,在这里记录一下. Stream是什 ...

  2. java1.8新特性之stream流式算法

    在Java1.8之前还没有stream流式算法的时候,我们要是在一个放有多个User对象的list集合中,将每个User对象的主键ID取出,组合成一个新的集合,首先想到的肯定是遍历,如下: List& ...

  3. Stream流式编程

    Stream流式编程   Stream流 说到Stream便容易想到I/O Stream,而实际上,谁规定“流”就一定是“IO流”呢?在Java 8中,得益于Lambda所带来的函数式编程,引入了一个 ...

  4. Java8——Stream流式操作的一点小总结

    我发现,自从我学了Stream流式操作之后,工作中使用到的频率还是挺高的,因为stream配合着lambda表达式或者双冒号(::)使用真的是优雅到了极致!今天就简单分(搬)享(运)一下我对strea ...

  5. 第46天学习打卡(四大函数式接口 Stream流式计算 ForkJoin 异步回调 JMM Volatile)

    小结与扩展 池的最大的大小如何去设置! 了解:IO密集型,CPU密集型:(调优)  //1.CPU密集型 几核就是几个线程 可以保持效率最高 //2.IO密集型判断你的程序中十分耗IO的线程,只要大于 ...

  6. Java8中的Stream流式操作 - 入门篇

    作者:汤圆 个人博客:javalover.cc 前言 之前总是朋友朋友的叫,感觉有套近乎的嫌疑,所以后面还是给大家改个称呼吧 因为大家是来看东西的,所以暂且叫做官人吧(灵感来自于民间流传的四大名著之一 ...

  7. Stream流式计算

    Stream流式计算 集合/数据库用来进行数据的存储 而计算则交给流 /** * 现有5个用户,用一行代码 ,一分钟按以下条件筛选出指定用户 *1.ID必须是偶数 *2.年龄必须大于22 *3.用户名 ...

  8. jdk8的stream流式计算的操作

    jdk8之后增加了流式计算,现在根据学习了流式计算,并把过程记录下来: Person.java的bean package com.zhang.collectordemo; /** * @program ...

  9. Java1.8新特性 - Stream流式算法

    一. 流式处理简介   在我接触到java8流式数据处理的时候,我的第一感觉是流式处理让集合操作变得简洁了许多,通常我们需要多行代码才能完成的操作,借助于流式处理可以在一行中实现.比如我们希望对一个包 ...

  10. Java8新特性 Stream流式思想(二)

    如何获取Stream流刚开始写博客,有一些不到位的地方,还请各位论坛大佬见谅,谢谢! package cn.com.zq.demo01.Stream.test01.Stream; import org ...

随机推荐

  1. 基于uQRCode封装的Vue3二维码生成插件

    标题:基于uQRCode封装的Vue3二维码生成插件 摘要:本文介绍了一种基于uQRCode封装的Vue3二维码生成插件,可以在Javascript运行环境下生成二维码并返回图片地址.该插件适用于所有 ...

  2. 关于mac电脑突然搜不到家里wifi但手机却能连上的问题解决

    今天用mac电脑时,突然遇到一个奇怪的问题,家里wifi用的好好的,突然就连不上了,在看电脑能搜索到的wifi,居然家里的wifi都没有搜索到,但自己的手机却是正常的,然后我再看看我另外一台windo ...

  3. [CF403E]Two Rooted Trees

    Two Rooted Trees 题面翻译 题目描述 你有两棵有根树,每棵树都有 \(n\) 个结点.不妨将这两棵树上的点都用 \(1\) 到 \(n\) 之间的整数编号.每棵树的根结点都是 \(1\ ...

  4. [CF1830D] Mex Tree

    题目描述 You are given a tree with $ n $ nodes. For each node, you either color it in $ 0 $ or $ 1 $ . T ...

  5. [洛谷P8867] [NOIP2022] 建造军营

    [NOIP2022] 建造军营 题目描述 A 国与 B 国正在激烈交战中,A 国打算在自己的国土上建造一些军营. A 国的国土由 \(n\) 座城市组成,\(m\) 条双向道路连接这些城市,使得任意两 ...

  6. MySQL中IN()按照指定列指定规则排序

    现在我有这么一个需求,我需要通过IN(id1,id2,......)查询id字段,并且id字段按照IN()中的顺序排序 例如:IN(5,1,2,4) ===> 查询出来的结果也应该为 5,1,2 ...

  7. Python 提取 Word 文档中的文本和图片

    将内容从 Word 文档中提取出来可以方便我们对其进行其他操作,如将内容储存在数据库中.将内容导入到其他程序中.用于 AI 训练以及制作其他文档等.第三方库 Spire.Doc for Python  ...

  8. django数据库事务操作celery任务注意事项

    from django.db import transaction from django.http import HttpResponseRedirect @transaction.atomic d ...

  9. 简单几行实现sliver上线提醒

    准备魔改sliver去掉一些特征什么的,这里记录一下最简单实现上线消息通过企业微信机器人提醒的方式,这很简单也有很多不足还需要接着改的 protobuf中对消息Beacon和Session的定义如下, ...

  10. Java 在PDF中绘制形状(基于Spire.Cloud.SDK for Java)

    Spire.Cloud.SDK for Java提供了pdfPathApi接口可用于在PDF文档中绘制形状(或图形),如绘制线条形状drawLine().绘制矩形形状drawRectanglef(), ...