创建流的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);
    }

 

posted @ 2019-01-23 21:33  超轶绝尘  阅读(559)  评论(0编辑  收藏  举报