Stream:java1.8新特性

Stream:java1.8新特性

what?(它是什麼)

stream流,Stream 就如同一個迭代器(Iterator),單向,不可往復,數據只能遍歷一次,遍歷過一次後即用盡了,就好比流水從面前流過,一去不復返.
Stream 可以並行化操作,使用並行去遍歷時,數據會被分成多個段,其中每一個都在不同的線程中處理,然後將結果一起輸出。Stream的並行操作依賴於 Java7 中引入的 Fork/Join 框架(JSR166y)來拆分任務和加速處理過程。

why?(爲什麼使用它)

但在當今這個數據大爆炸的時代,在數據來源多樣化、數據海量化的今天,很多時候不得不脫離 RDBMS,或者以底層返回的數據爲基礎進行更上層的數據統計
更多的時候是程序員需要用 Iterator 來遍歷集合,完成相關的聚合應用邏輯.但是效率很低
而使用stream使用併發模式,程序執行速度更快.

how?(怎麼做)

一、流的初始化與轉換:

Java中的Stream的所有操作都是針對流的,所以,使用Stream必須要得到Stream對象:
1.初始化一個流:

Stream stream = Stream.of("a", "b", "c");

2.數組轉換爲一個流:

String [] strArray = new String[] {"a", "b", "c"};
    stream = Stream.of(strArray);
或者
stream = Arrays.stream(strArray);

3.集合對象轉換爲一個流(Collections):

List<String> list = Arrays.asList(strArray);
    stream = list.stream();

二、流的操作:

流的操作可以歸結爲幾種:

1.遍歷操作(map):

使用map操作可以遍歷集合中的每個對象,並對其進行操作,map之後,用.collect(Collectors.toList())會得到操作後的集合。

1.1.遍歷轉換爲大寫:
List<String> output = wordList.stream().
     map(String::toUpperCase).
           collect(Collectors.toList());
1.2.平方數:
List<Integer> nums = Arrays.asList(1, 2, 3, 4);
   List<Integer> squareNums = nums.stream().
         map(n -> n * n).
       collect(Collectors.toList());
2.過濾操作(filter):

使用filter可以對象Stream中進行過濾,通過測試的元素將會留下來生成一個新的Stream。

2.1.得到其中不爲空的String
List<String> filterLists = new ArrayList<>();
filterLists.add("");
filterLists.add("a");
filterLists.add("b");
List afterFilterLists = filterLists.stream()
       .filter(s -> !s.isEmpty())
        .collect(Collectors.toList());
3.循環操作(forEach):

如果只是想對流中的每個對象進行一些自定義的操作,可以使用forEach:

List<String> forEachLists = new ArrayList<>();
forEachLists.add("a");
forEachLists.add("b");
forEachLists.add("c");
forEachLists.stream().forEach(s-> System.out.println(s));
4.返回特定的結果集合(limit/skip):

limit 返回 Stream 的前面 n 個元素;skip 則是扔掉前 n 個元素:

List<String> forEachLists = new ArrayList<>();
forEachLists.add("a");
forEachLists.add("b");
forEachLists.add("c");
forEachLists.add("d");
forEachLists.add("e");
forEachLists.add("f");
List<String> limitLists = forEachLists.stream().skip(2).limit(3).collect(Collectors.toList());

注意skip與limit是有順序關係的,比如使用skip(2)會跳過集合的前兩個,返回的爲c、d、e、f,然後調用limit(3)會返回前3個,所以最後返回的c,d,e

5.排序(sort/min/max/distinct):

sort可以對集合中的所有元素進行排序。max,min可以尋找出流中最大或者最小的元素,而distinct可以尋找出不重複的元素:

5.1.對一個集合進行排序:
List<Integer> sortLists = new ArrayList<>();
sortLists.add(1);
sortLists.add(4);
sortLists.add(6);
sortLists.add(3);
sortLists.add(2);
List<Integer> afterSortLists = sortLists.stream().sorted((In1,In2)->
       In1-In2).collect(Collectors.toList());
5.2、得到其中長度最大的元素:
List<String> maxLists = new ArrayList<>();
maxLists.add("a");
maxLists.add("b");
maxLists.add("c");
maxLists.add("d");
maxLists.add("e");
maxLists.add("f");
maxLists.add("hahaha");
int maxLength = maxLists.stream().mapToInt(s->s.length()).max().getAsInt();
System.out.println("字符串長度最長的長度爲"+maxLength);
5.3、對一個集合進行查重:
List<String> distinctList = new ArrayList<>();
distinctList.add("a");
distinctList.add("a");
distinctList.add("c");
distinctList.add("d");
List<String> afterDistinctList = distinctList.stream().distinct().collect(Collectors.toList());

其中的distinct()方法能找出stream中元素equal(),即相同的元素,並將相同的去除,上述返回即爲a,c,d。

6、匹配(Match方法):

有的時候,我們只需要判斷集合中是否全部滿足條件,或者判斷集合中是否有滿足條件的元素,這時候就可以使用match方法:
allMatch:Stream 中全部元素符合傳入的 predicate,返回 true
anyMatch:Stream 中只要有一個元素符合傳入的 predicate,返回 true
noneMatch:Stream 中沒有一個元素符合傳入的 predicate,返回 true

6.1、判斷集合中沒有有爲‘c’的元素:
List<String> matchList = new ArrayList<>();
matchList.add("a");
matchList.add("a");
matchList.add("c");
matchList.add("d"); 
boolean isExits = matchList.stream().anyMatch(s -> s.equals("c"));
6.2、判斷集合中是否全不爲空:
List<String> matchList = new ArrayList<>();
matchList.add("a");
matchList.add("");
matchList.add("a");
matchList.add("c");
matchList.add("d");
boolean isNotEmpty = matchList.stream().noneMatch(s -> s.isEmpty());

則返回的爲false

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