失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > java8 group by_java8新特性Java 8 – Stream Collectors groupingBy 示例 - Java教程

java8 group by_java8新特性Java 8 – Stream Collectors groupingBy 示例 - Java教程

时间:2019-05-28 22:36:54

相关推荐

java8 group by_java8新特性Java 8 – Stream Collectors groupingBy 示例 - Java教程

在这篇教程中,将向你展示如何使用Java 8 Stream的Collectors,来对一个List进行分组,计算个数,求和以及排序。

1. Group By, Count and Sort

1.1 对一个List进行分组,并显示每组的个数

Java8Example1.java

package com.mkyong.java8;

import java.util.Arrays;

import java.util.List;

import java.util.Map;

import java.util.function.Function;

import java.util.stream.Collectors;

public class Java8Example1 {

public static void main(String[] args) {

//3 apple, 2 banana, others 1

List items =

Arrays.asList("apple", "apple", "banana",

"apple", "orange", "banana", "papaya");

Map result =

items.stream().collect(

Collectors.groupingBy(

Function.identity(), Collectors.counting()

)

);

System.out.println(result);

}

}

output

{

papaya=1, orange=1, banana=2, apple=3

}

1.2 加入排序

Java8Example2.java

package com.mkyong.java8;

import java.util.Arrays;

import java.util.LinkedHashMap;

import java.util.List;

import java.util.Map;

import java.util.function.Function;

import java.util.stream.Collectors;

public class Java8Example2 {

public static void main(String[] args) {

//3 apple, 2 banana, others 1

List items =

Arrays.asList("apple", "apple", "banana",

"apple", "orange", "banana", "papaya");

Map result =

items.stream().collect(

Collectors.groupingBy(

Function.identity(), Collectors.counting()

)

);

Map finalMap = new LinkedHashMap<>();

//Sort a map and add to finalMap

result.entrySet().stream()

.sorted(paringByValue()

.reversed()).forEachOrdered(e -> finalMap.put(e.getKey(), e.getValue()));

System.out.println(finalMap);

}

}

output

{

apple=3, banana=2, papaya=1, orange=1

}

2. List Objects

对用户定义的对象数组进行分组的例子。

2.1 一个简单java对象.

Item.java

package com.mkyong.java8;

import java.math.BigDecimal;

public class Item {

private String name;

private int qty;

private BigDecimal price;

//constructors, getter/setters

}

2.2 通过name属性分组,并显示分组个数或Qty属性的数量

Java8Examples3.java

package com.mkyong.java8;

import java.math.BigDecimal;

import java.util.Arrays;

import java.util.List;

import java.util.Map;

import java.util.stream.Collectors;

public class Java8Examples3 {

public static void main(String[] args) {

//3 apple, 2 banana, others 1

List 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"))

);

Map counting = items.stream().collect(

Collectors.groupingBy(Item::getName, Collectors.counting()));

System.out.println(counting);

Map sum = items.stream().collect(

Collectors.groupingBy(Item::getName, Collectors.summingInt(Item::getQty)));

System.out.println(sum);

}

}

output

//Group by + Count

{

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 通过Price分组 – 使用Collectors.groupingBy 和 Collectors.mapping 的例子.

Java8Examples4.java

package com.mkyong.java8;

import java.math.BigDecimal;

import java.util.Arrays;

import java.util.List;

import java.util.Map;

import java.util.Set;

import java.util.stream.Collectors;

public class Java8Examples4 {

public static void main(String[] args) {

//3 apple, 2 banana, others 1

List 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"))

);

//group by price

Map> groupByPriceMap =

items.stream().collect(Collectors.groupingBy(Item::getPrice));

System.out.println(groupByPriceMap);

// group by price, uses 'mapping' to convert List to Set

Map> result =

items.stream().collect(

Collectors.groupingBy(Item::getPrice,

Collectors.mapping(Item::getName, Collectors.toSet())

)

);

System.out.println(result);

}

}

output

{

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}

]

}

//group by + mapping to Set

{

19.99=[banana],

29.99=[orang, watermelon],

9.99=[papaya, apple]

}

References

[Stackoverflow – Sort a Map by values (Java) ][Stackoverflow _ Sort a Map by values Java]

如果觉得《java8 group by_java8新特性Java 8 – Stream Collectors groupingBy 示例 - Java教程》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。