zoukankan      html  css  js  c++  java
  • JDK8流式处理常用例子

    public class Apple {
    
        private Integer id;
        private String name;
    
        private BigDecimal money;
        private Integer num;
    
        public Apple(Integer id, String name, BigDecimal money, Integer num) {
            this.id = id;
            this.name = name;
            this.money = money;
            this.num = num;
        }
    
        @Override
        public String toString() {
    
            return this.name + " " + this.money + " " + this.num;
        }
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public BigDecimal getMoney() {
            return money;
        }
    
        public void setMoney(BigDecimal money) {
            this.money = money;
        }
    
        public Integer getNum() {
            return num;
        }
    
        public void setNum(Integer num) {
            this.num = num;
        }
    }
    @RunWith(JUnit4.class)
    public class CollectionTest {
    
        static List<Apple> appleList;
    
        static {
    
            appleList = new ArrayList<>();// 存放apple对象集合
    
            Apple apple1 = new Apple(1, "苹果1", new BigDecimal("3.25"), 10);
            Apple apple12 = new Apple(1, "苹果2", new BigDecimal("1.35"), 20);
            Apple apple2 = new Apple(2, "香蕉", new BigDecimal("2.89"), 30);
            Apple apple3 = new Apple(3, "荔枝", new BigDecimal("9.99"), 40);
    
            appleList.add(apple1);
            appleList.add(apple12);
            appleList.add(apple2);
            appleList.add(apple3);
        }
        
        @Test
        public void practiceGrouping() {
            Map<Integer, List<Apple>> groupBy = appleList.stream().collect(Collectors.groupingBy(Apple::getId));
    
            System.out.println("groupBy:" + groupBy);
        }
    
        @Test
        public void practiceMapping() {
    
            /**
             * List -> Map 需要注意的是: toMap 如果集合对象有重复的key,会报错Duplicate key .... apple1,apple12的id都为1。 可以用 (k1,k2)->k1
             * 来设置,如果有重复的key,则保留key1,舍弃key2
             */
            Map<Integer, Apple> appleMap = appleList.stream()
                    .collect(Collectors.toMap(Apple::getId, a -> a, (k1, k2) -> k1));
        }
    
        @Test
        public void practiceSum() {
    
            BigDecimal totalMoney = appleList.stream().map(Apple::getMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
            System.err.println("totalMoney:" + totalMoney); // totalMoney:17.48     
         //上面是bigdecimal的 如果是Integer    

         Integer totalMoney2 = appleList.stream().map(Apple::getNum).reduce(0, Integer::sum);    
    System.err.println("totalMoney:" + totalMoney2); // totalMoney:500
      }
    
        @Test
        public void practiceMaxMin() {
    
            Optional<Apple> maxDish = appleList.stream().collect(Collectors.maxBy(Comparator.comparing(Apple::getMoney)));
            maxDish.ifPresent(System.out::println);
    
            Optional<Apple> minDish = appleList.stream().collect(Collectors.minBy(Comparator.comparing(Apple::getMoney)));
            minDish.ifPresent(System.out::println);

          Optional<Apple> maxDish2 = appleList.stream().max(Comparator.comparing(Apple::getMoney));
          maxDish.ifPresent(System.out::println);

    
    

          Optional<Apple> minDish2 = appleList.stream().min(Comparator.comparing(Apple::getMoney));
          minDish.ifPresent(System.out::println);

        }
    
        @Test
        public void practiceRemoveDup() {
            List<Apple> unique = appleList.stream().collect(
                    Collectors.collectingAndThen(
                            Collectors.toCollection(() -> new TreeSet<>(Comparator.comparingLong(Apple::getId))), ArrayList::new)
            );
            
            for (Apple apple : unique) {
                System.out.println(apple);
            }
        }
    }

     更新一组List怎么转数组

    List<Integer> list2 = new ArrayList<>();
            for (int i = 1; i <= 10; ++i) {
                list2.add(i);
            }
            int[] array = list2.stream().mapToInt(Integer::valueOf).toArray();

    而调用List本身的toArray只能返回包装类型

    Integer[] tempArray = new Integer[0];
    
            list2.toArray(tempArray);

    如果tempArray是 int[]直接报错

    ====================== 2021-10-26 =================================

    最大最小值

    例子1:

    List<String> list = Arrays.asList("adnm", "admmt", "pot", "xbangd", "weoujgsd");
            Optional<String> max = list.stream().max(Comparator.comparing(String::length));
            System.out.println("最长的字符串:" + max.get());

    例子2

    List<Integer> list = Arrays.asList(7, 6, 9, 4, 11, 6);
            // 自然排序
            Optional<Integer> max = list.stream().max(Integer::compareTo);
            // 自定义排序
            Optional<Integer> max2 = list.stream().max(new Comparator<Integer>() {
                @Override
                public int compare(Integer o1, Integer o2) {
                    return o1.compareTo(o2);
                }
            });
            System.out.println("自然排序的最大值:" + max.get());
            System.out.println("自定义排序的最大值:" + max2.get());

    count方法计数

    List<Integer> list = Arrays.asList(7, 6, 4, 8, 2, 11, 9);
            long count = list.stream().filter(x -> x > 6).count();
            System.out.println("list中大于6的元素个数:" + count);

    reduce

    List<Integer> list = Arrays.asList(1, 3, 2, 8, 11, 4);
            // 求和方式1
            Optional<Integer> sum = list.stream().reduce(Integer::sum);
            // 求和方式2
            Optional<Integer> sum2 = list.stream().reduce(Integer::sum);
            // 求和方式3
            Integer sum3 = list.stream().reduce(0, Integer::sum);
            // 求乘积
            Optional<Integer> product = list.stream().reduce((x, y) -> x * y);
            // 求最大值方式1
            Optional<Integer> max = list.stream().reduce((x, y) -> x > y ? x : y);
            // 求最大值写法2
            Integer max2 = list.stream().reduce(1, Integer::max);

    归集(toList/toSet/toMap)

         List<Integer> list = Arrays.asList(1, 6, 3, 4, 6, 7, 9, 6, 20);
            List<Integer> listNew = list.stream().filter(x -> x % 2 == 0).collect(Collectors.toList());
            Set<Integer> set = list.stream().filter(x -> x % 2 == 0).collect(Collectors.toSet());
            List<Person> personList = new ArrayList<Person>();
            personList.add(new Person("Tom", 8900, 23, "male", "New York"));
            personList.add(new Person("Jack", 7000, 25, "male", "Washington"));
            personList.add(new Person("Lily", 7800, 21, "female", "Washington"));
            personList.add(new Person("Anni", 8200, 24, "female", "New York"));
            Map<?, Person> map = personList.stream().filter(p -> p.getSalary() > 8000)
                    .collect(Collectors.toMap(Person::getName, p -> p));

    统计(count/averaging) 求和 

         List<Person> personList = new ArrayList<Person>();
            personList.add(new Person("Tom", 8900, 23, "male", "New York"));
            personList.add(new Person("Jack", 7000, 25, "male", "Washington"));
            personList.add(new Person("Lily", 7800, 21, "female", "Washington"));
            // 求总数
            long count = personList.size();
            // 求平均工资
            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));

    分组(partitioningBy/groupingBy)、

    List<Person> personList = new ArrayList<Person>();
            personList.add(new Person("Tom", 8900, 23, "male", "Washington"));
            personList.add(new Person("Jack", 7000, 25, "male", "Washington"));
            personList.add(new Person("Lily", 7800, 21, "female", "New York"));
            personList.add(new Person("Anni", 8200, 24, "female", "New York"));
            // 将员工按薪资是否高于8000分组
            Map<Boolean, List<Person>> part = personList.stream().collect(Collectors.partitioningBy(x -> x.getSalary() > 8000));
            // 将员工按性别分组
            Map<String, List<Person>> group = personList.stream().collect(Collectors.groupingBy(Person::getSex));
            // 将员工先按性别分组,再按地区分组
            Map<String, Map<String, List<Person>>> group2 = personList.stream().collect(Collectors.groupingBy(Person::getSex, Collectors.groupingBy(Person::getArea)));

    join

    List<Person> personList = new ArrayList<Person>();
            personList.add(new Person("Tom", 8900, 23, "male", "New York"));
            personList.add(new Person("Jack", 7000, 25, "male", "Washington"));
            personList.add(new Person("Lily", 7800, 21, "female", "Washington"));
            String names = personList.stream().map(Person::getName).collect(Collectors.joining(","));
            System.out.println("所有员工的姓名:" + names);
            List<String> list = Arrays.asList("A", "B", "C");
            String string = list.stream().collect(Collectors.joining("-"));
            System.out.println("拼接后的字符串:" + string);

    sort

    List<Person> personList = new ArrayList<Person>();
            personList.add(new Person("Sherry", 9000, 24, "female", "New York"));
            personList.add(new Person("Tom", 8900, 22, "male", "Washington"));
            personList.add(new Person("Jack", 9000, 25, "male", "Washington"));
            personList.add(new Person("Lily", 8800, 26, "male", "New York"));
            personList.add(new Person("Alisa", 9000, 26, "female", "New York"));
            // 按工资升序排序(自然排序)
            List<String> newList = personList.stream().sorted(Comparator.comparing(Person::getSalary)).map(Person::getName)
                    .collect(Collectors.toList());
            // 按工资倒序排序
            List<String> newList2 = personList.stream().sorted(Comparator.comparing(Person::getSalary).reversed())
                    .map(Person::getName).collect(Collectors.toList());
            // 先按工资再按年龄升序排序
            List<String> newList3 = personList.stream()
                    .sorted(Comparator.comparing(Person::getSalary).thenComparing(Person::getAge)).map(Person::getName)
                    .collect(Collectors.toList());
            // 先按工资再按年龄自定义排序(降序)
            List<String> newList4 = personList.stream().sorted((p1, p2) -> {
                if (p1.getSalary() == p2.getSalary()) {
                    return p2.getAge() - p1.getAge();
                } else {
                    return p2.getSalary() - p1.getSalary();
                }
            }).map(Person::getName).collect(Collectors.toList());

    提取/组合

         String[] arr1 = { "a", "b", "c", "d" };
            String[] arr2 = { "d", "e", "f", "g" };
            Stream<String> stream1 = Stream.of(arr1);
            Stream<String> stream2 = Stream.of(arr2);
            // concat:合并两个流 distinct:去重
            List<String> newList = Stream.concat(stream1, stream2).distinct().collect(Collectors.toList());
            // limit:限制从流中获得前n个数据
            List<Integer> collect = Stream.iterate(1, x -> x + 2).limit(10).collect(Collectors.toList());
            // skip:跳过前n个数据
            List<Integer> collect2 = Stream.iterate(1, x -> x + 2).skip(1).limit(5).collect(Collectors.toList());
  • 相关阅读:
    spring boot三种方式设置跨域
    完整卸载Mysql
    【OBIEE】OBIEE集成Echarts作图
    【OBIEE】BIEE培训(一)
    【Oracle】Oracle物化视图
    【Oracle】oracle11g安装过程提示swap size 检查失败问题
    【Linux】centOS7下安装GUI图形界面
    【Nginx】Linux环境搭建nginx负载
    【oracle】Oracle创建带参数视图
    抢票:搭建github最火的12306项目
  • 原文地址:https://www.cnblogs.com/juniorMa/p/14355074.html
Copyright © 2011-2022 走看看