Stream实战-统计
stream在开发中经常使用场景就是统计,再次记录一下实际开发中用的到统计,使用模拟数据。
需求如下:
代码如下:
/*** map集合统计*/
public class StreamDemo4 {/*** 实体类*/@Data@AllArgsConstructor@NoArgsConstructorclass Book{/** 名称 */private String name;/** 数量 */private Integer count;}/*** 初始化集合*/public List<Book> init(){return Stream.of(new Book("java",10),new Book("java",20),new Book("web",10),new Book("linux",10)).collect(Collectors.toList());}/*** map分组统计每科书的数量*/public Map<String,Integer> mapCount(){List<Book> init = init();return init.stream().collect(Collectors.groupingBy(Book::getName, Collectors.summingInt(Book::getCount)));}/*** Map 转换 List*/public List<Book> mapConvertList(){Map<String, Integer> map = mapCount();return map.entrySet().stream().map(entry -> new Book(entry.getKey(), entry.getValue())).collect(Collectors.toList());}/*** list统计每科书的数量*/public List<Book> listCount(){List<Book> init = init();return init.stream().collect(Collectors.groupingBy(Book::getName)).entrySet().stream().map(entry -> {String name = entry.getKey();int sum = entry.getValue().stream().mapToInt(Book::getCount).sum();return new Book(name, sum);}).collect(Collectors.toList());}public List<Book> groupAndSum() {List<Book> init = init();return init.stream().collect(Collectors.groupingBy(Book::getName,Collectors.reducing(0, Book::getCount, Integer::sum))).entrySet().stream().map(entry -> new Book(entry.getKey(), entry.getValue())).collect(Collectors.toList());}public static void main(String[] args) {StreamDemo4 streamDemo4 = new StreamDemo4();System.out.println("=== ===Map统计=== ===");streamDemo4.mapCount().entrySet().forEach(System.out::println);System.out.println("=== ===Map转换List=== ===");streamDemo4.mapConvertList().forEach(System.out::println);System.out.println("=== ===List统计=== ===");streamDemo4.listCount().forEach(System.out::println);System.out.println("=== ===List统计方式2=== ===");streamDemo4.groupAndSum().forEach(System.out::println);}
}
代码中的方法
- groupingBy:对流进行分组,在此案例中把name当作Key,把List<Book》当作value
- entrySet:把map集合转换成Set<Map<String,Integer》》格式
- map:提取原流中元素 进行处理
- mapToInt:把结果转换成IntStream流
- sum:和mapToInt搭配使用,IntStream流的结果求和
- reducing:对流进行一些统计,如求和,求积,统计,最大,最小等
进行处理 - mapToInt:把结果转换成IntStream流
- sum:和mapToInt搭配使用,IntStream流的结果求和
- reducing:对流进行一些统计,如求和,求积,统计,最大,最小等
- summingInt:对整数流元素进行求和