Java8新特性之streamAPI(二)

stream操作的三個步驟之中間操作 

  • 篩選與切片
    ​​​​​​filter——接收Lambda,從流中排除某些元素
    limit——截斷流,使其元素不超過給定數量
    skip——跳過元素,返回一個扔掉了前n個元素的流。若留着元素不足n個,則返回一個空流。與limit(n)互補
    distinct——篩選,通過流所生成元素的hashCode()和equals()去除重複元素。
  • 內部迭代:迭代操作由StreamAPI完成
  • 映射
    map——接收Lambda,將元素轉換成其他形式或提取信息。接收一個函數作爲參數,該函數會被應用到每個元素上,並將其映射成一個新的元素。
    flatMap——接收一個函數作爲參數,將流中的每個值都換成另一個流,然後把所有流連接成一個流
  • 排序
    sorted()——自然排序Comparable
    sorted(Comparator com)——定製排序
    package streamAPI;
    
    import lambda.Employee;
    import org.apache.hadoop.yarn.webapp.hamlet.Hamlet;
    import org.junit.Test;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.stream.Stream;
    
    
    public class TestStreamAPI2 {
    
        List<Employee> employees = Arrays.asList(
                new Employee("張三", 25, 9000),
                new Employee("李四", 38, 10000),
                new Employee("王曉", 45, 12000),
                new Employee("李華", 28, 9500),
                new Employee("花花", 22, 8000),
                new Employee("李華", 28, 9500),
                new Employee("花花", 22, 8000),
                new Employee("花花", 22, 8000),
                new Employee("李華", 28, 9500),
                new Employee("花花", 22, 8000)
        );
    
        //中間操作
        /*
         *篩選與切片
         * filter——接收Lambda,從流中排除某些元素
         * limit——截斷流,使其元素不超過給定數量
         * skip——跳過元素,返回一個扔掉了前n個元素的流。若留着元素不足n個,則返回一個空流。與limit(n)互補
         * distinct——篩選,通過流所生成元素的hashCode()和equals()去除重複元素。
         */
    
        /**
         * 多箇中間操作可以連接起來形成一個流水線,除非流水線上觸發終止操作,否則智能關鍵操作不會執行,
         * 而在終止操作時一次性全部處理,稱爲“惰性求值”
         */
    
        //內部迭代:迭代操作由StreamAPI完成
        @Test
        public void test1() {
            //中間操作
            Stream<Employee> stream1 = employees.stream()
                    .filter((e) -> e.getAge() > 35);
            //終止操作
            stream1.forEach(System.out::println);
        }
    
        @Test
        public void test2() {
            employees.stream()
                    .filter((e) -> {
                        System.out.println("短路!");
                        return e.getSalary() > 5000;
                    })
                    .limit(2)
                    .forEach(System.out::println);
        }
    
        @Test
        public void test3() {
            employees.stream()
                    .filter((e) -> e.getSalary() > 5000)
                    .skip(2)
                    .forEach(System.out::println);
        }
    
        @Test
        public void test4() {
            employees.stream()
                    .filter((e) -> e.getSalary() > 5000)
                    .skip(2)
                    .distinct()
                    .forEach(System.out::println);
        }
    
        //中間操作
        /*
         * 映射
         * map——接收Lambda,將元素轉換成其他形式或提取信息。接收一個函數作爲參數,該函數會被應用到每個元素上,並將其映射成一個新的元素。
         * flatMap——接收一個函數作爲參數,將流中的每個值都換成另一個流,然後把所有流連接成一個流
         */
        @Test
        public void test5() {
            List<String> list = Arrays.asList("aaa", "bbb", "ccc", "ddd", "eee");
            list.stream()
                    .map((str) -> str.toUpperCase())
                    .forEach(System.out::println);
    
            System.out.println("----------------------------------");
    
            employees.stream()
                    .distinct()
                    .map(Employee::getName)
                    .forEach(System.out::println);
    
            //{{a,a,a},{b,b,b},{c,c,c},{d,d,d},{e,e,e}}
            Stream<Stream<Character>> stream = list.stream()
                    .map(TestStreamAPI2::filterCharacter);
            stream.forEach((sm) ->
                    sm.forEach(System.out::println));
    
            System.out.println("---------------------------");
    
    
            //{a,a,a,b,b,b,c,c,c,d,d,d,e,e,e}
            list.stream()
                    .flatMap(TestStreamAPI2::filterCharacter)
                    .forEach(System.out::println);
        }
    
        public static Stream<Character> filterCharacter(String str) {
            List<Character> list = new ArrayList<>();
            for (Character ch : str.toCharArray()) {
                list.add(ch);
            }
            return list.stream();
        }
    
        //中間操作
        /*
         *排序
         * sorted()——自然排序Comparable
         * sorted(Comparator com)——定製排序
         */
        @Test
        public void test6() {
            List<String> list = Arrays.asList("ccc", "aaa", "bbb", "ddd", "eee");
    
            list.stream()
                    .sorted()
                    .forEach(System.out::println);
    
            System.out.println("----------------------------------");
    
            employees.stream()
                    .sorted((e1,e2)-> {
                        if (e1.getAge() == e2.getAge()) {
                            return e1.getName().compareTo(e2.getName());
                        }
                        else {
                            return Integer.compare(e1.getAge(),e2.getAge());
                        }
                    })
                    .forEach(System.out::println);
        }
    }
    

    相關函數聲明詳見:https://blog.csdn.net/qq_38358499/article/details/104636487

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章