Java8 Stream Step2 中间操作

package com.xbb.java.stream;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

/**
 * 筛选和过滤
 * 1 : filter --接收Lambda.从流中排除某些元素.
 * 2 : limit  --截断流,使其元素不超过给定数量.
 * 3 : skip(n)--跳过元素,返回一个扔掉了前n个元素的流.若流中元素不足n个.则返回一个空流.与limit(n)互补.
 * 4 : distinct-筛选.通过流所生成元素的hashCode()和equals()去除重复元素.
 */
public class StreamDemo_Step_2 {


    public static void main(String[] args) {
        step2_filter();
        step2_limit();
        step2_skip();
        step2_mapping_map();
        step2_flatmap();
        step2_sort();
    }

    static List<Person> list = Arrays.asList(
            new Person(1,"小败笔-1",32),
            new Person(2,"小败笔-2",52),
            new Person(3,"小败笔-3",72),
            new Person(4,"小败笔-4",12),
            new Person(5,"小败笔-5",52),
            new Person(5,"小败笔-5",52)
    );

    /**
     * 2 : 中间操作 : 过滤操作
     */
    public static void step2_filter(){
        Stream<Person> stream = list.stream();
        // 过滤操作 , 过滤年龄小于30岁的人
        stream.filter((person -> person.getAge()>30))
        .forEach(System.out::println);
    }
    /**
     * 2 : 中间操作 : 截断操作
     */
    public static void step2_limit(){
        System.out.println("--------");
        Stream<Person> stream = list.stream();
        // 截断操作
        stream.limit(2).forEach(System.out::println);
    }
    /**
     * 2 : 中间操作 : 跳过操作
     */
    public static void step2_skip(){
        System.out.println("--------");
        Stream<Person> stream = list.stream();
        stream.skip(2).forEach(System.out::println);
    }
    /**
     * 2 : 中间操作 : 去重操作
     *  去重操作需要重写equals和hashCode操作
     */
    public static void step2_distinct(){
        System.out.println("--------");
        Stream<Person> stream = list.stream();
        stream.distinct().forEach(System.out::println);
    }

    /**
     * 2 : 中间操作 : 映射
     * map -- 接收Lambda,将元素转化成其他形式或提取信息.接收一个函数作为参数.该函数会被应用到每个元素上.并将其他映射成为一个新的元素.
     * flatMap--接收一个函数作为参数.将流中的每个值都换成另一个流.然后把所有流都连接成一个流.
     */
    public static void step2_mapping_map(){
        System.out.println("--------");
        // 转换大小写用法
        List<String> li = Arrays.asList("aaa","bbb","ccc","ddd","eee");
        Stream stream = li.stream().map((str)->str.toUpperCase());
        stream.forEach(System.out::println);
        System.out.println("--------");
        // 提取名称用法
        Stream<Person> stream1 = list.stream();
        Stream<String> stream2 = stream1.map(Person::getName);//.forEach(System.out::println);
        stream2.forEach(System.out::println);
    }

    /**
     * 2 : 中间操作 : 映射 flatmap
     */
    public static void step2_flatmap(){
        System.out.println("--------");
        // 把集合中的数据以单个字母的形式打印到Console
        List<String> li = Arrays.asList("aaa","bbb","ccc","ddd","eee");

        // 第一种做法 : 比较麻烦
        Stream<String> stream = li.stream();
        Stream<Stream<Character>> stream1 = stream.map(StreamDemo_Step_2::step2_flatmap_help);
        stream1.forEach((sm) -> {
            sm.forEach(System.out::println);
        });

        System.out.println("--------");

        // 第二种做法 : flatmap : 推荐,把多个相同泛型的子流合并为一个流
        Stream<Character> charStream = li.stream().flatMap(StreamDemo_Step_2::step2_flatmap_help);
        charStream.forEach(System.out::println);

    }

    /**
     * 上面方法的辅助方法
     * @param str
     * @return
     */
    public static Stream<Character> step2_flatmap_help(String str){
        Stream<Character> stream = null;
        try{
            List<Character> list = new ArrayList<>();
            for (Character ch : str.toCharArray()){
                list.add(ch);
            }
            stream = list.stream();
        }catch (Exception e){
            e.printStackTrace();
        }
        return stream;
    }

    /**
     * 2 : 中间操作 : 排序
     *
     *  自然排序 : 按comparable排序称为自然排序 ; sorted()
     *  定制排序 : 按sorted(Comparator)
     *
     *
     */
    public static void step2_sort(){

        // 自然排序
        List<String> li = Arrays.asList("ccc","ddd","bbb","aaa","eee");
        li.stream()
                .sorted()
                .forEach(System.out::println);

        // 定制排序
        Stream<Person> stream = list.stream()
                .sorted((p1,p2)->{
                   if(p1.getAge()==p2.getAge()){
                       return p1.getName().compareTo(p2.getName());
                   }else{
                       return Integer.compare(p1.getAge(),p2.getAge());
                   }
                });
        stream.forEach(System.out::println);
    }
}

猜你喜欢

转载自blog.csdn.net/jinjianghai/article/details/92967073