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. 【Codeforces Global Round 12】 C2 - Errich-Tac-Toe题解(思维)

    题面 题目要求不能有有三个连续相同的'X'或'O',注意到这样的连续串它们的横纵坐标之和是连续变化的,考虑将它们按照横纵坐标之和对 \(3\)的模值分组,因为这样分组后相邻的三个相同字符就被分到了三个 ...

  2. Centos离线安装JDK+Tomcat+MySQL8.0+Nginx

    一.安装JDK 注:以下命令环境在Xshell中进行. 1.查询出系统自带的OpenJDK及版本 rpm -qa | grep jdk 2.如果显示已安装openjdk则对其进行卸载. #卸载 rpm ...

  3. VS Code安装教程

    一.下载 1.官网 下载地址:https://code.visualstudio.com/Download 2.下载 根据自己电脑型号下载,此处以Windows为例. 二.安装 1.下载完成后,直接点 ...

  4. 7-8次PTA和期末成绩总结

    (1)前言:总结之前所涉及到的知识点.题量.难度等情况 课程成绩统计程序-3在第二次的基础上修改了计算总成绩的方式(修改类结构,将成绩类的继承关系改为组合关系,成绩信息由课程成绩类和分项成绩类组成,课 ...

  5. VSCode个性化的配置

    1.下载插件 Eclipse快捷键(我以前用Eclipse习惯了,大家不需要) Premitter Vetur koroFileHeader 2.修改VSCode设置 3.粘贴下面的代码 { &quo ...

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

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

  7. [python] 基于Dataset库操作数据库

    dataset库是Python中一个用于操作数据库的简单库,它提供了一种简洁的方式与各种关系型数据库进行交互,例如SQLite.MySQL.PostgreSQL 等.你可以使用dataset库来执行查 ...

  8. vulnhub - lazySysAdmin - writeup

    信息收集 可以看到目标开放了常见的22, 80, 139, 445, 3306这个6667的服务少见. root@kali tmp/lazySysAdmin » arp-scan -I eth1 -l ...

  9. java.time包中的类如何使用

    java.time包是在java8中引入的日期和时间处理API,提供了一组全新的类,用于更灵活.更强大的处理日期和时间. 常用用法 1.localDate 表示日期,不包含时间和时区信息 import ...

  10. Mysql在sql中截取时间类型字段的年月日和时间

    DATE_FORMAT() 函数 DATE_FORMAT() 函数用于以不同的格式显示日期/时间数据. 下面的脚本使用 DATE_FORMAT() 函数来显示不同的格式.我们使用 NOW() 来获得当 ...