Java 8 Stream Collectors groupingBy 示例
阿新 • • 發佈:2019-01-27
展示如何使用Java 8 Stream Collectors
進行分組,計數,總和和排序List
分組,計數和排序
1.1分組List
並顯示其總數。
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<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);
}
}
Output
{ 番木瓜= 1,橙= 1,香蕉= 2,蘋果= 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<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()));
System.out.println(finalMap);
}
}
Output
{ 蘋果= 3,香蕉= 2,木瓜= 1,橙= 1 }
2.List Objects
“分組”使用者定義的物件列表的示例。
2.1 Pojo。
Item.javapackage com.mkyong.java8;
import java.math.BigDecimal;
public class Item {
private String name;
private int qty;
private BigDecimal price;
//constructors, getter/setters
}
2.2 按姓名+數字或數量組合。
Java8Examples3.javapackage 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<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"))
);
Map<String, Long> counting = items.stream().collect(
Collectors.groupingBy(Item::getName, Collectors.counting()));
System.out.println(counting);
Map<String, Integer> sum = items.stream().collect(
Collectors.groupingBy(Item::getName, Collectors.summingInt(Item::getQty)));
System.out.println(sum);
}
}
Output
// Group by + Count { 番木瓜= 1,香蕉= 2,蘋果= 3,猩猩= 1,西瓜= 1 } // Group by + Sum qty { 番木瓜= 20,香蕉= 30,蘋果= 40,orang = 10,西瓜= 10 }
2.2按價格分組 - Collectors.groupingBy
以Collectors.mapping
示例為例。
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<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"))
);
//group by price
Map<BigDecimal, List<Item>> groupByPriceMap =
items.stream().collect(Collectors.groupingBy(Item::getPrice));
System.out.println(groupByPriceMap);
// group by price, uses 'mapping' to convert List<Item> to Set<String>
Map<BigDecimal, Set<String>> 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 +對映到Set { 19.99 = [香蕉] 29.99 = [orang,西瓜], 9.99 = [番木瓜,蘋果] }