Java 8 的 Stream API是對集合(Collection)功能的增強,能進行各種便利、高效的聚合操作(aggregate operation),或者數據操作。
同時提供順序流和並行流兩模式進行匯聚操作:
- 並行模式:把一個內容分成多個數據塊,並用不同的線程分別處理每個數據塊的流(Fork/Join),能夠充分利用多核處理器的優勢。使用 fork/join 並行方式拆分任務和加速處理過程。
- 順序模式:一個一個執行
- 順序流的操作是在單線程上執行,而並行流的操作是在多線程上併發。
- 並不是所有的問題都適合使用並行模式,考量要點:數據量、任務是否獨立、資料是否有順序
- stream() − 為集合創建串行流;parallelStream() − 為集合創建並行流。
Stream建構方法
//基本數值型,目前有三種對應的包裝類型 Stream:IntStream、LongStream、DoubleStream ,可以直接套用增加效能 //Individual values Stream stream = Stream.of("a", "b", "c"); // 2. Arrays String [] strArray = new String[] {"a", "b", "c"}; Stream streamA = Stream.of(strArray); Stream streamB = Arrays.stream(strArray); IntStream.of(new int[]{1, 2, 3}); IntStream.range(1, 3); IntStream.rangeClosed(1, 3); // 3. Collections List<String> list = Arrays.asList(strArray); Stream stream = list.stream();
Stream API操作類型
- intermediate operation( 中介操作 ):map (mapToInt, flatMap 等)、 filter、 distinct、 sorted、 peek、 limit、 skip、 parallel、 sequential、 unordered。
一個Stream後面可以跟隨0或多個操作,尚未真正開始Stream的遍歷,多個操作在 Terminal 操作的時候一次循環完成 - terminal operations( 聚合操作 ):forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、 count、 anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 iterator,真正開始Stream的遍歷
- Short-circuiting: anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 limit
filter:過濾,符合條件的留下
List<String> strList = Arrays.asList("A", "B", "AA", "C"); List<String> strListAfter = strList.stream() .filter(x -> x.contains("A")) .collect(Collectors.toList());
map:把 input Stream 的每一個元素,映射成 output Stream 的另外一個元素
List<String> strList = Arrays.asList("A", "B", "AA", "C"); List<String> strListAfter = strList.stream() .map(x -> x+"_test") .collect(Collectors.toList());
flatMap:將最底層元素抽出來放到一起
Stream<List<Integer>> inputStream = Stream.of( Arrays.asList(1), Arrays.asList(2, 3), Arrays.asList(4, 5, 6) ); Stream<Integer> outputStream = inputStream. flatMap((childList) -> childList.stream());
limit: 限制回傳數量
List<String> strList = Arrays.asList("A", "B", "AA", "C"); strList.stream().limit(2);
skip:略過元素
List<String> strList = Arrays.asList("A", "B", "AA", "C"); strList.stream().skip(2);
reduce:把 Stream 元素组合起来
//第一個val=初始值,a=累積值, b=此次值 String concat = Stream.of("A", "B", "C", "D").reduce("", String::concat); IntStream.of(new int[]{1, 2, 3}).reduce(0, (a, b) -> a+b);
forEach:走訪元素
List<String> strList = Arrays.asList("A", "B", "AA", "C"); Arrays.asList("A", "B", "AA", "C").stream() .forEach(System.out::println);
sorted
//正序排列 List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5); numbers.stream() .sorted((x, y) -> x - y) .collect(Collectors.toList());
ref`: https://blog.csdn.net/caishi13202/article/details/82667230
ref: https://developer.ibm.com/zh/languages/java/articles/j-lo-java8streamapi/
文章標籤
全站熱搜
留言列表