zoukankan      html  css  js  c++  java
  • 创建流的5种方式、筛选、映射、排序

    一、创建流的5种方式

    /**
         * 创建流的5种方式
         */
        public static void test1() {
            //1.可以通过Collection系列集合提供的stream()或paralleStream()
            List<String> list = new ArrayList<>();
            Stream<String> stream1 = list.stream();
    
    
            //2.通过Arrays中的静态方法stream()获取数组流
            Employee[] emps = new Employee[10];
            Stream<Employee> stream2 = Arrays.stream(emps);
    
            //3.通过Stream类中的静态方法of()
            Stream<String> stream3 = Stream.of("aaa", "bbb", "ccc");
    
    
            //4.创建无限流
            //迭代(种子[起始值],参数返回值相同的函数式流)
            Stream<Integer> stream4 = Stream.iterate(0, x -> x + 2);
            stream4.limit(10).forEach(System.out::println);//方法引用,所以不能再写成x->System.out::println,这就lambda和方法引用2掺儿了
    
            //5.生成 (供给型lambda流)
            //
            Stream<Double> generate = Stream.generate(() -> Math.random());
            generate.limit(5)
                    .forEachOrdered(System.out::println);//方法引用,所以不能再写成x->System.out::println,这就lambda和方法引用2掺儿了
        }

    二、筛选与切片

    /**
         * 筛选与切片
         * filter   接收Lambda,从流中排除某些元素
         * limit    截断流,使袁术不超过给定的数量。
         * skip(n)  跳过元素,返回一个扔掉了前n个元素的流。若元素中不足n个,则返回一个空流。与limit(n)互补
         * distinct 筛选,通过流产生的元素的hashCode() 和 equals()去除重复元素
         */
        public static void test2() {
            List<Employee> emps = Arrays.asList(
                    new Employee(101, "张三", 18, 9999.99),
                    new Employee(102, "李四", 59, 6666.66),
                    new Employee(103, "王五", 28, 3333.33),
                    new Employee(104, "赵六", 8, 7777.77),
                    new Employee(105, "田七", 38, 5555.55)
            );
    
    
            Stream<Employee> stream = emps.stream()
                                          .filter(x -> { //中间操作,不会执行任何操作
                System.out.println("Stream API 的中间操作");
                return x.getAge() > 35;
            });
    
            //终止操作:一次性执行全部内容,即"惰性求值"
            stream.forEach(System.out::println);
    
    
        }

    执行结果:

    Stream API 的中间操作
    Stream API 的中间操作
    Employee [id=102, name=李四, age=59, salary=6666.66]
    Stream API 的中间操作
    Stream API 的中间操作
    Stream API 的中间操作
    Employee [id=105, name=田七, age=38, salary=5555.55]

    映射

    <R> Stream<R> map(Function<? super T, ? extends R> mapper);
    Funciton是函数型接口,只有一个入参,那么这个入参即【类:实例方法】调用的类对应的类型。
    Funciton没有第二个参数,所以【类:实例方法】--> 【实例方法】没有参数。
        
        public static void test5() {
            Arrays.asList("aaa","bbb","ccc").stream()
                                            .map(x -> x.toUpperCase())
                                            .forEach(System.out::println);
    
            System.out.println("---------------");
            emps.stream()
                .map(Employee::getAge)
    //            .map(x -> x*100)
                .forEach(System.out::println);
    
        }
        /**
         * 字符串转字符流
         * @param str
         * @return
         */
        public static Stream<Character> filterCharacter(String str) {
            List<Character> list = new ArrayList<>();
            for(Character c : str.toCharArray()) {
                list.add(c);
            }
            return list.stream();
        }
    
        /**
         * map流套流,相当于Collection.add(Collection) [['a','a','a'],['b','b','b'],['c','c','c']]
         */
        public static void test6() {
            Stream<Stream<Character>> streamStream = Arrays.asList("aaa", "bbb", "ccc").stream()
                    .map(TestStream::filterCharacter);
            streamStream.forEach(x -> {
                x.forEach(System.out::println);
            });
        }
    
        /**
         * flatMap流套流相当于Collection.addAll(Collection)['a','a','a','b','b','b','c','c','c']
         */
        public static void test7() {
            Stream<Character> streamStream = Arrays.asList("aaa", "bbb", "ccc").stream()
                    .flatMap(TestStream::filterCharacter);
            streamStream.forEach(System.out::println);
        }

    排序

    /**
         * sorted  默认排序
         * sorted(Comparator) 定制化排序
         */
        public static void test8() {
            emps.stream().sorted((x,y) -> {
               if(x.getAge() == y.getAge()) {
                   return x.getName().compareTo(y.getName());
               } else {
                   return Integer.compare(x.getAge(),y.getAge());
               }
            }).forEach(System.out::println);
        }
  • 相关阅读:
    Java基础语法
    C语言练习题目
    C语言进阶(1)
    C语言易错点
    SQL语句入门
    C语言算法基础
    C语言算法入门
    嵌入式入门
    C语言基础(3)
    C语言基础(2)
  • 原文地址:https://www.cnblogs.com/guchunchao/p/10311658.html
Copyright © 2011-2022 走看看