引言
在本文中,我們將向您展示如何使用 java8 流的 Collectors 對列表進行分組、計數、求和和排序。
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);
輸出:
{
papaya=1, orange=1, banana=2, apple=3
}
- 添加排序
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<>();
result.entrySet().stream()
.sorted(Entry.<String,Long>comparingByValue().reversed()).forEachOrdered(e->finalMap.put(e.getKey(),e.getValue()));
System.out.println(finalMap);
輸出:
{
apple=3, banana=2, papaya=1, orange=1
}
2.列出對象
按用戶定義的對象列表進行“分組”的示例。
- 按名稱分組,並統計數量或求和。
public class Item {
private String name;
private int qty;
private BigDecimal price;
//constructors, getter/setters
}
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> couting = items.stream()
.collect(Collectors.groupingBy(Item::getName, Collectors.counting()));
System.out.println(couting);
System.out.println("======");
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}
======
{papaya=20, banana=30, apple=40, orang=10, watermelon=10}
- 按價格分組,Collectors.groupingBy and 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"))
);
System.out.println("=====>group by price:");
// group by price
Map<BigDecimal, List<Item>> groupByPriceMap = items.stream()
.collect(Collectors.groupingBy(Item::getPrice));
System.out.println(groupByPriceMap);
Map<BigDecimal, Set<String>> collect = items.stream().collect(Collectors
.groupingBy(Item::getPrice, Collectors.mapping(Item::getName, Collectors.toSet())));
System.out.println("=====>group by + mapping to Set:");
System.out.println(collect);
輸出:
=====>group by price:
{ 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]
}
源碼見:java-8-demo
系列文章詳見:Java 8 教程