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


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流

文章插图
6.4接合(joining) joining可以将stream中的元素用特定的连接符(没有的话 , 则直接连接)连接成一个字符串 。
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, "女", "上海"));String persons = personList.stream().map(p -> p.getName() + "-" + p.getSex() + "-" + p.getSalary()).collect(Collectors.joining(","));System.out.println("所有员工信息:" + persons);}

经验总结扩展阅读