含具体案例 Java8新特性之Stream流( 三 )


下面用一个案例演示toList、toSet和toMap:
public static void main(String[] args) {List<Integer> list = Arrays.asList(1, 3, 4, 8, 6, 2, 20, 13);List<Integer> list1 = list.stream().filter(a -> a % 2 == 0).collect(Collectors.toList());Set<Integer> list2 = list.stream().filter(a -> a % 2 == 0).collect(Collectors.toSet());System.out.println("被2整除的list集合" + list1);System.out.println("被2整除的set集合" + list2);List<Person> personList = new ArrayList<>();personList.add(new Person("张三", 1000, 20, "男", "北京"));personList.add(new Person("李四", 2000, 21, "男", "南京"));personList.add(new Person("王五", 3000, 20, "女", "合肥"));personList.add(new Person("赵六", 4000, 22, "男", "四川"));personList.add(new Person("孙七", 5000, 25, "女", "上海"));// 工资大于3000元的员工Map<String, Integer> map = personList.stream().filter(person -> person.getSalary() > 3000).collect(Collectors.toMap(Person::getName, person -> person.getSalary()));System.out.println("工资大于3000元的员工:" + map);}结果:

含具体案例 Java8新特性之Stream流

文章插图
6.2统计(count/averaging)Collectors提供了一系列用于数据统计的静态方法:
计数:count平均值:averagingInt、averagingLong、averagingDouble最值:maxBy、minBy求和:summingInt、summingLong、summingDouble统计以上所有:summarizingInt、summarizingLong、summarizingDouble
public static void main(String[] args) {List<Person> personList = new ArrayList<>();personList.add(new Person("张三", 1000, 20, "男", "北京"));personList.add(new Person("李四", 2000, 21, "男", "南京"));personList.add(new Person("王五", 3000, 20, "女", "合肥"));personList.add(new Person("赵六", 4000, 22, "男", "四川"));personList.add(new Person("孙七", 5000, 25, "女", "上海"));// 统计员工人数、平均工资、工资总额、最高工资// 员工总人数long count = personList.stream().count();// 平均工资Double average = personList.stream().collect(Collectors.averagingDouble(Person::getSalary));// 最高工资Optional<Integer> max = personList.stream().map(Person::getSalary).max(Integer::compare);// 工资之和int sum = personList.stream().mapToInt(Person::getSalary).sum();// 一次性统计所有信息DoubleSummaryStatistics collect = personList.stream().collect(Collectors.summarizingDouble(Person::getSalary));System.out.println("员工总人数:" + count);System.out.println("员工平均工资:" + average);System.out.println("员工工资总和:" + sum);System.out.println("员工工资所有统计:" + collect);}结果:
含具体案例 Java8新特性之Stream流

文章插图
6.3分组(partitioningBy/groupingBy)
  • 分区:将stream按条件分为两个Map,比如员工按薪资是否高于8000分为两部分 。
  • 分组:将集合分为多个Map,比如员工按性别分组 。有单级分组和多级分组 。
public static void main(String[] args) {List<Person> personList = new ArrayList<>();personList.add(new Person("张三", 1000, 20, "男", "北京"));personList.add(new Person("李四", 2000, 21, "男", "南京"));personList.add(new Person("王五", 3000, 20, "女", "合肥"));personList.add(new Person("赵六", 4000, 22, "男", "合肥"));personList.add(new Person("孙七", 5000, 25, "女", "上海"));// 按薪资高于3000分组Map<Boolean, List<Person>> salaryGroup = personList.stream().collect(Collectors.partitioningBy(p -> p.getSalary() > 3000));List<Person> group1 = salaryGroup.get(true);List<Person> group2 = salaryGroup.get(false);for (Person person : group1) {System.out.println("薪资高于3000元组:" + person);}for (Person person : group2) {System.out.println("薪资低于3000元组:" + person);}// 按性别分组Map<String, List<Person>> sexGroup = personList.stream().collect(Collectors.groupingBy(Person::getSex));List<Person> group3 = sexGroup.get("男");List<Person> group4 = sexGroup.get("女");for (Person person : group3) {System.out.println("男子组:" + person);}for (Person person : group4) {System.out.println("女子组:" + person);}// 将员工先按性别分组,再按地区分组Map<String, Map<String, List<Person>>> group = personList.stream().collect(Collectors.groupingBy(Person::getSex, Collectors.groupingBy(Person::getArea)));Map<String, List<Person>> manGroup = group.get("男");Map<String, List<Person>> womenGroup = group.get("女");List<Person> group5 = manGroup.get("合肥");List<Person> group6 = womenGroup.get("上海");System.out.println("地区在合肥的男子组:" + group5);System.out.println("地区在上海的女子组:" + group6);}结果:
含具体案例 Java8新特性之Stream流

推荐阅读