相关文章推荐
讲道义的砖头  ·  MongoDB ...·  4 月前    · 

本文会用几个例子去讲解Stream流 group by基本用法,以及group by分组之后对于分组数据的汇总、排序等操作

1、 Group By 计算+ 汇总

1.1 Group by 集合,并展示最后的汇总数据

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() 汇总个数 Function . identity ( ) , Collectors . counting ( ) papaya = 1 , orange = 1 , banana = 2 , apple = 3

1.2 Group by 集合,并且将他按顺序加入到新Map中去

//3 apple, 2 banana, others 1 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 ( ) Map < String , Long > finalMap = new LinkedHashMap < > ( ) ; //Sort a map and add to finalMap result . entrySet ( ) . stream ( ) . sorted ( Map . Entry . < String , Long > comparingByValue ( ) . reversed ( ) ) . forEachOrdered ( e -> finalMap . put ( e . getKey ( ) , e . getValue ( ) ) ) ; apple = 3 , banana = 2 , papaya = 1 , orange = 1

2、List 集合

2.1 对象的基本处理

public class Item {
    private String name;
    private int qty;
    private BigDecimal price;
 List<Item> items = Arrays.asList(
                new Item("apple", 10, new BigDecimal("9.99")),
                new Item("banana", 20, new BigDecimal("19.99")),
                new Item("orang", 10, new BigDecimal("29.99")),
                new Item("watermelon", 10, new BigDecimal("29.99")),
                new Item("papaya", 20, new BigDecimal("9.99")),
                new Item("apple", 10, new BigDecimal("9.99")),
                new Item("banana", 10, new BigDecimal("19.99")),
                new Item("apple", 20, new BigDecimal("9.99"))
//先针对name属性分组,然后计算总数
        Map<String, Long> counting = items.stream().collect(
                Collectors.groupingBy(Item::getName, Collectors.counting()));
        System.out.println(counting);
//先针对name属性分组,然后根据Qty属性进行求和
        Map<String, Integer> sum = items.stream().collect(
                Collectors.groupingBy(Item::getName, Collectors.summingInt(Item::getQty)));
        System.out.println(sum);
	papaya=1, banana=2, apple=3, orang=1, watermelon=1
//Group by + Sum qty
	papaya=20, banana=30, apple=40, orang=10, watermelon=10

2.2 Collectors.mapping 的例子

    List<Item> items = Arrays.asList(
                new Item("apple", 10, new BigDecimal("9.99")),
                new Item("banana", 20, new BigDecimal("19.99")),
                new Item("orang", 10, new BigDecimal("29.99")),
                new Item("watermelon", 10, new BigDecimal("29.99")),
                new Item("papaya", 20, new BigDecimal("9.99")),
                new Item("apple", 10, new BigDecimal("9.99")),
                new Item("banana", 10, new BigDecimal("19.99")),
                new Item("apple", 20, new BigDecimal("9.99"))
		//根据price分组
        Map<BigDecimal, List<Item>> groupByPriceMap = 
			items.stream().collect(Collectors.groupingBy(Item::getPrice));
        System.out.println(groupByPriceMap);
		//先根据price分组 然后再将分好组的数据,通过Collectors.mapping再一次把name放入set中(mappinng 使得 List -> set)
        Map<BigDecimal, Set<String>> result =
                items.stream().collect(
                        Collectors.groupingBy(Item::getPrice,
                                Collectors.mapping(Item::getName, Collectors.toSet())
        System.out.println(result);
        	19.99=[
			Item{name='banana', qty=20, price=19.99}, 
			Item{name='banana', qty=10, price=19.99}
			29.99=[
			Item{name='orang', qty=10, price=29.99}, 
			Item{name='watermelon', qty=10, price=29.99}
			9.99=[
			Item{name='apple', qty=10, price=9.99}, 
			Item{name='papaya', qty=20, price=9.99}, 
			Item{name='apple', qty=10, price=9.99}, 
			Item{name='apple', qty=20, price=9.99}
//通过mapping转变为set
	19.99=[banana], 
	29.99=[orang, watermelon], 
	9.99=[papaya, apple]
./gradlew bootRun
 使用RIOT生成消息: 
riot-gen import --end 10000000 id= # index xadd --keyspace events
 您应该会在侦听器应用程序控制台中看到统计信息: 
-- Meters ----------------------------------------------------------------------
eventsConsumed
             count = 743850
         mean rate = 43687.26 events/second
     1-minute rate = 49792.70 events/second
     5-minut
				
问题背景: 需求分析 ,对查询出来的数据,进行按类型,名称,开始时间进行排序,排序完之后需要进行分组,但是在groupBy分组的时候,顺序却是乱的?并没有按照自己进行排序的list进行返回。 带问题排查 sort排序没问题,问题出在groupBy身上,看看groupby问什么会无序。查看源码 * Returns a {@code Collector} implementing a "group by" operation on * input elements of t
https://www.jb51.net/article/194171.htm 这篇文章主要介绍了Java8 stream 中利用 groupingBy 进行多字段分组求和案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 Java8的groupingBy实现集合的分组,类似Mysql的group by分组功能,注意得到的是一个map 对集合按照单个属性分组、分组计数、排序 List<String> items = Arrays.asList("appl..
代码块如下: List<AgentCheckoutStockDetail> agentCheckoutStockDetails = agentCheckoutStockDetailRepository.selectByExample(ws); Map<String, Long> countMap = agentCheckoutStockDetails.stream() .collect(Collectors.groupingBy(o -> o.getDel
groupby的函数定义: DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, **kwargs) by :接收映射、函数、标签或标签列表;用于确定聚合的组。 axis : 接收 0/1;用于表示沿行(0)或列(1)分割。 level : 接收int、级别名称或序列,默认为None;如果轴是一个多索引(层次化),则按一个或多个特定级别分组。 as_index:接收布尔值,默认Ture;Ture则返回以组标签为索引的对象
三句话 让同事看不懂代码 streamgroupingby分组后排序重构value一. 需求二. 上操作 git仓库直达 如何让同事看不懂你写的代码 然后觉得你非常牛逼 这里用到了stream()与Lambda 需要有点基础,没基础你炫个???? 一. 需求 又来一个新需求 我们需要将相同key的value集合起来(对象list< Obiect >或者list < string >),并按照指定字符串进行内部排序 例如aa > bb > cc (指定字符) 其他的排在后
1. Group By, Count and Sort 1.1 Group by aListand display the total count of it.(按列表分组,并显示其总数) Java8Example1.java package com.mkyong.java8; import java.util.Arrays; import java.util.List;
StreamJava 8中新增的一个特性,可以对集合进行快速、简洁、灵活的操作,可以代替传统的循环处理方式。使用Stream需要以下步骤: 1. 创建Stream:通过集合的stream()方法或者Arrays.stream()方法创建Stream。 2. 中间操作:对Stream进行各种中间操作,如过滤、排序、转换等。 3. 终止操作:对Stream执行终止操作,如聚合、收集等,此时Stream操作才会被执行。 举个例子,对一个简单的List进行操作: List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); // 通过stream()方法创建Stream Stream<Integer> stream1 = list.stream(); // 中间操作:通过filter()方法过滤列表中的元素 Stream<Integer> stream2 = stream1.filter(i -> i > 2); // 终止操作:通过forEach()方法遍历中的元素 stream2.forEach(System.out::println); 上述代码中,首先通过list.stream()方法创建了一个Stream,然后使用filter()方法过滤出大于2的元素,最后使用forEach()方法遍历输出中的元素。 除了中间操作和终止操作Stream还支持延迟计算,也就是说,只有在终止操作时才会真正执行操作,这种特性可以大大提高代码的效率。