溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java8中Stream的篩選,切片與映射怎么用

發(fā)布時間:2021-11-23 09:44:37 來源:億速云 閱讀:222 作者:小新 欄目:編程語言

這篇文章將為大家詳細講解有關Java8中Stream的篩選,切片與映射怎么用,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

使用Stream的三個操作步驟
  1. 創(chuàng)建Stream

  2. 中間操作

  3. 終止操作(終端操作)

    @Test
    public void test1(){
        //創(chuàng)建Stream
        //1.可以通過Collection系列集合提供的stream()獲取串行流或parallelStream()獲取并行流
        List<String> list = new ArrayList<>();
        Stream<String> stream1 = list.stream();
    
        //2.通過Arrays中的靜態(tài)方法stream()獲取數(shù)組流
        Employee[] emps = new Employee[10];
        Stream<Employee> stream2 = Arrays.stream(emps);
    
        //3.通過Stream類中的靜態(tài)方法of()
        Stream<String> stream3 = Stream.of("aa", "bb", "cc");
    
        //4.創(chuàng)建無限流
        //通過迭代創(chuàng)建無限流
        Stream<Integer> stream4 = Stream.iterate(0, (x) -> x + 2);
    
        //中間操作和終止操作
        stream4.limit(10).forEach(System.out::println);
    
        //通過生成隨機數(shù)創(chuàng)建無限流
        Stream.generate(() -> Math.random())
                .limit(5)
                .forEach(System.out::println);
    }
    內部迭代與外部迭代

    內部迭代:迭代操作由Stream API自己完成
    外部迭代:由自己寫的程序完成

    //內部迭代:迭代操作由Stream API完成
    @Test
    public void test1(){
        //中間操作:不會執(zhí)行任何操作
        Stream<Employee> employeeStream = employees.stream()
                                                    .filter((e) -> {
                                                        System.out.println("Stream API的中間操作");
                                                        return e.getAge() > 35;
                                                    });
        //終止操作:一次性執(zhí)行全部內容,即"惰性求值"
        employeeStream.forEach(System.out::println);
    }
    
    //外部迭代
    @Test
    public void test2(){
        Iterator<Employee> iterator = employees.iterator();
    
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
    篩選與切片的用法
  4. filter---接收Lambda,從流中排除某些元素

  5. limit---截斷流,使其元素不超過給定的數(shù)量

  6. skip(n)---跳過元素,返回一個扔掉了前n個元素的流。若流中元素不足n個,則返回一個空流,與limit(n)互補

  7. distinct---篩選,通過流所生成元素的hashCode( )和equals( )去除重復元素

    List<Employee> employees = Arrays.asList(
            new Employee("張三", 18 ,9999.99),
            new Employee("李四", 38, 5555.99),
            new Employee("王五", 50, 6666.66),
            new Employee("趙六", 16, 3333.33),
            new Employee("田七", 8, 7777.77),
            new Employee("田七", 8, 7777.77),
            new Employee("田七", 8, 7777.77)
    );
    @Test
    public void test3(){
        employees.stream()
                 .filter((e) -> {
                     System.out.println("短路");
                     return e.getSalary() > 5000;
                 })
                 .limit(2)
                 .forEach(System.out::println);
    }
    
    @Test
    public void test4(){
        employees.stream()
                 .filter((e) -> e.getSalary() > 5000)
                 .skip(2)
                 .forEach(System.out::println);
    }
    
    @Test
    public void test5(){
        employees.stream()
                .filter((e) -> e.getSalary() > 5000)
                .skip(2)
                .distinct()
                .forEach(System.out::println);
    }
    映射的用法
  8. map---接收Lambda,將元素轉換成其他形式或提取信息。接收一個函數(shù)作為參數(shù),該參數(shù)會被應用到每個元素上,并將其映射成一個新的元素。

  9. flatMap---接收一個函數(shù)作為參數(shù),將流中的每個值換成另一個流,然后把所有流連接成一個流

    public static Stream<Character> filterCharacter(String str){
        List<Character> list = new ArrayList<>();
    
        for (Character ch : str.toCharArray()){
            list.add(ch);
        }
    
        return list.stream();
    }
    
    @Test
    public void test6(){
        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()
                 .map(Employee::getName)
                 .forEach(System.out::println);
    
        System.out.println("-----------------------------");
    
        Stream<Stream<Character>> stream = list.stream()
                .map(TestStreamAPI2::filterCharacter);//{{a, a, a}, {b, b, b}}
    
        stream.forEach((sm) -> {
            sm.forEach(System.out::println);
        });
    
        System.out.println("--------------------------------");
    
        Stream<Character> sm = list.stream()
                .flatMap(TestStreamAPI2::filterCharacter);//{a, a, a, b, b, b}
    
        sm.forEach(System.out::println);
    }

關于“Java8中Stream的篩選,切片與映射怎么用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI