天天看點

Java中Stream流詳解一、Stream流概述二、擷取Stream流的兩種方式三、Stream流的常用方法

目錄

一、Stream流概述

1、兩種周遊集合方式的比較

2、流式思想

個人了解的流式思想

Stream流是一個來自資料源的元素隊列

和Collection操作不同,Stream操作還有兩個基本特征:

當使用一個流的時候通常包括三個基本步驟:

二、擷取Stream流的兩種方式

1、所有的Collection集合都可以通過stream方法擷取流

代碼示範:

2、Stream接口的靜态方法of可以擷取數組對應的流

代碼示範:

三、Stream流的常用方法

1、常用方法分為兩類:

①延遲方法:

②終結方法:

2、forEach周遊

方法:

代碼示例:

3、fliter過濾

方法:

作用:

代碼實作:

注意:

代碼說明:

4、map映射

方法:

作用:

示範:

5、count計數

方法:

作用:

代碼示範:

6、limit截取前N個元素

方法:

作用:

代碼實作:

7、skip跳過前N個元素

方法:

作用:

代碼實作:

8、concat流的合并

方法:

作用:

代碼實作:

一、Stream流概述

1、兩種周遊集合方式的比較

package study.stream;

import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("張大哥");
        list.add("李三哥");
        list.add("張二哥");
        list.add("馬五弟");
        list.add("張六弟");
        //需求:找出姓張的哥哥
        //傳統方法
        for (String s : list) {
            if(s.startsWith("張")&&s.endsWith("哥")){
                System.out.println(s);
            }
        }
        //stream流的方式
        list.stream()
                .filter((s)->s.startsWith("張"))
                .filter((s)->s.endsWith("哥"))
                .forEach(System.out::println);
    }
}
           

2、流式思想

個人了解的流式思想

Stream的作用是使對一些資料的操作更加友善、快捷;

就像工廠裡的生産線對産品進行多步驟加工,每一步加工之後傳回的還是産品本身,隻不過是加工過的産品,然後繼續下一步加工操作,就像上面的代碼,每一行代碼就相當于進行一次加工,加工後還是傳回産品本身,是以可以直接進行下一個方法調用;

Stream流是一個來自資料源的元素隊列

①元素是特定類型的對象,形成一個隊列;(在java中Stream并不會存儲資料,隻是進行按需計算)

②資料源:流的來源。可以是集合、數組等;

和Collection操作不同,Stream操作還有兩個基本特征:

①Pipelining:中間操作都會傳回流本身;

②内部疊代:以前對集合的周遊都是通過Iterator疊代器進行的,這種叫外部疊代;Stream提供了内部疊代的方式,流可以直接調用周遊方法;

當使用一個流的時候通常包括三個基本步驟:

①擷取資料源(Source);

②資料轉換;

③執行操作擷取想要的結果;

二、擷取Stream流的兩種方式

1、所有的Collection集合都可以通過stream方法擷取流

代碼示範:

//一、把集合轉換為Stream流
        //list集合
        List<String> list = new ArrayList<>();
        Stream<String> s1 = list.stream();
        //set集合
        Set<String> set = new HashSet<>();
        Stream<String> s2 = set.stream();
        //map集合
        Map<String,String> map = new HashMap<>();
        //擷取鍵,存儲到一個set集合中
        Set<String> set1 = map.keySet();
        Stream<String> s3 = set1.stream();
        //擷取值,存儲到一個Collection集合中
        Collection<String> collection = map.values();
        Stream<String> s4 = collection.stream();
        //擷取鍵值對(鍵與值的映射關系 entrySet)
        Set<Map.Entry<String, String>> entrySet = map.entrySet();
        Stream<Map.Entry<String, String>> s5 = entrySet.stream();
           

2、Stream接口的靜态方法of可以擷取數組對應的流

代碼示範:

//二、把數組轉換為Stream流
        Integer[] arr = {1,2,3,4,5};
        Stream<Integer> stream = Stream.of(arr);
        String[] strings = {"你好!","Hello!","哈哈哈!"};
        Stream<String> stream1 = Stream.of(strings);
           

三、Stream流的常用方法

1、常用方法分為兩類:

①延遲方法:

傳回值類型仍然是Stream接口自身類型的方法,是以支援鍊式調用(除了終結方法外,其他方法都是延遲方法);

②終結方法:

傳回值類型不再是Stream接口自身的方法,是以不再支援類似StringBuilder那樣的鍊式調用,本小節中終結方法包括count和forEach;

2、forEach周遊

方法:

void forEach(Consumer<? super T> action);

該方法接收一個Consumer接口函數,會将每一個流元素交給該方法處理;

代碼示例:

Stream<String> stream = Stream.of("你好!","Hello!","哈哈!");
        stream.forEach(System.out::println);
        //你好!
        //Hello!
        //哈哈!
           

3、fliter過濾

方法:

Stream<T> fliter(Predicate<? super T> predicate);
           

作用:

将一個流轉換為一個子集流;

Predicate接口是用于判斷的接口;

代碼實作:

Stream<String> stream = Stream.of("你好!","Hello!","哈哈!");
        Stream<String> stream1 = stream.filter((word)->word.startsWith("你"));
        stream1.forEach(System.out::println);//你好!
           

注意:

Stream流隻能使用一次;

代碼說明:

Stream<String> stream = Stream.of("你好!","Hello!","哈哈!");
        Stream<String> stream1 = stream.filter((word)->word.startsWith("你"));
        stream1.forEach(System.out::println);//你好!
        //Stream流是管道流,隻能使用一次
        stream1.forEach(System.out::println);//報錯
        //java.lang.IllegalStateException: stream has 
        // already been operated upon or closed
           

4、map映射

方法:

<R> Stream<R> map(Function<? super T, ? extends R> mapper );
           

作用:

将流中的元素映射到另一個流中;

Function接口的抽象方法R apply(T t)可以将T類型轉換成R類型,而這種轉換的動作,成為映射;

示範:

Stream<String> stream = Stream.of("1","2","3");
        Stream<Integer> stream1 = stream.map(Integer::parseInt);
        stream1.forEach(System.out::println);
        //1
        //2
        //3
           

5、count計數

方法:

long count
           

作用:

統計個數,相當于集合的size方法;

代碼示範:

Stream<String> stream = Stream.of("1","2","3");
        System.out.println(stream.count());//3
           

6、limit截取前N個元素

方法:

Stream<T> limit(long maxSize);
           

作用:

截取前N個元素;

代碼實作:

Stream<String> stream = Stream.of("1","2","3");
        stream.limit(3).forEach(System.out::println);
        //1
        //2
        //3
           

7、skip跳過前N個元素

方法:

Stream<T> skip(long n);
           

作用:

跳過前N個元素;

代碼實作:

Stream<String> stream = Stream.of("1","2","3");
        stream.skip(2).forEach(System.out::println);//3
           

8、concat流的合并

方法:

static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b)
           

作用:

将兩個流合并成一個流;

代碼實作:

Stream<String> stream1 = Stream.of("1","2","3");
        Stream<String> stream2 = Stream.of("4","5","6");
        Stream.concat(stream1,stream2).forEach(System.out::println);
        //1
        //2
        //3
        //4
        //5
        //6