前言:
之前在學習JDK1.8的時候接觸到了1.8的兩個重要的新特新,一個是lambda函數式編程、另一個則是接口的變化,在這里還有一個非常重要的內容就是strema流式處理方式,在傳統的java代碼中,如果我們要對一個集合做一些操作,就必須遍歷這個集合那個集合中的元素逐個操作,而在JDK1.8引入stream流式處理方式后,我們可以不用對集合進行遍歷可以直接操作集合得到我們想要的結果,在這里看一個小例子:
例如在這里有一個存放字符串的list集合,我需要獲取list集合字符長度是三且不為空的字符串並且打印,我們來看一下傳統方式和stream方式的兩種寫法

public class Dermo01Strema { public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("逝清雪"); list.add("莫問"); /** * 傳統方式 */ for(String s: list){ if(null != s && s.length() == 3){ System.out.println(s); } } /** * strema方式 */ list.stream().filter(s -> null != s).filter(s -> s.length() == 3).forEach(System.out::println); } }
運行上面的代碼,我們都可以篩選出符合條件的字符串是“逝清雪”,但可以明顯看出用strema比我們用傳統的方式簡便很多,尤其是在我們判斷條件繼續增加是,會越來越明顯,而且stream和lambda一樣都是延遲執行,性能上要高效一些。
一、獲取stream的方式
通過上面的代碼可以看到我們我們在用strema流時,首先是通過:集合.stream()方法獲取到了集合流,從而調用java為我們提供Strema接口中的方法,那么我們要想使用stream流,就必須先獲取,關於獲取stream流的方式則有以下兩種。
1、集合Collection:直接.stream():
2、集合Map:使用間接方法entrySet、keySet、values,在.stream()方法,注:Map並不是Collection字接口,所以不能像Collection集合那樣直接.stream()方式獲取
3、數組:Arrays.stream方法、或者是Stream.of方法

public class Dermo01Strema { public static void main(String[] args) { List<String> list1 = new ArrayList<String>(); Stream<String> stremaList = list1.stream(); Map<String, Integer> map = new HashMap<String, Integer>(); Stream<String> mapStream2 = map.keySet().stream(); Stream<Integer> mapStream3 = map.values().stream(); Stream<Map.Entry<String, Integer>> mapStream1 = map.entrySet().stream(); String[] array = {"蒼井空", "吉澤明步"}; Stream<String> arrayStream1 = Arrays.stream(array); Stream<String> arrayStream2 = Stream.of(array);
二、stream中常用的方法
1、條件過濾:filter
2、統計個數:counrt
3、截取集合中的前幾個元素:limit
4、拋棄集合中的前幾個元素:skip
5、合並集合:concat
6、消費集合中的元素:forEach,注:forEach並不是for循環

public class Dermo01Strema { public static void main(String[] args) { List<String> list1 = new ArrayList<String>(); list1.add("莫問"); list1.add("逝清雪"); list1.add("王母娘娘"); list1.add("玉皇大帝"); list1.add("吉澤明步"); //filter方法 list1.stream().filter(s -> null != s).filter(s -> s.length() == 3).forEach(System.out::println); //count方法 System.out.println("count方法執行-------------"); System.out.println(list1.stream().count()); //limit方法 System.out.println("limit方法執行-------------"); list1.stream().limit(2).forEach(System.out::println); //skip方法 System.out.println("skip方法執行-------------"); list1.stream().skip(2).forEach(System.out::println); //concat方法 System.out.println("concat方法執行-------------"); List<String> list2 = new ArrayList<String>(); list2.add("蒼井空"); list2.add("宮崎駿"); Stream.concat(list1.stream(),list2.stream()).forEach(System.out::println); } }
三、將stream流轉換成集合的方式
1、轉List集合:stream.collect(Collectors.toList()):
2、轉Set集合:stream.collect(Collectors.toSet()):
3、轉數組:stream.toArray()、或者stream.toArray(泛型),注:推薦第二種,因為可以直接指定轉換后數組的泛型

public class Dermo01Strema { public static void main(String[] args) { List<String> list1 = new ArrayList<String>(); Stream<String> stremaList = list1.stream(); List<String> list12 = stremaList.collect(Collectors.toList()); Set<String> set = stremaList.collect(Collectors.toSet()); String[] array = {"蒼井空", "吉澤明步"}; Stream<String> arrayStream1 = Arrays.stream(array); String[] arry = arrayStream1.toArray(String[]::new); } }
四、stream獲取並發流
1、直接獲取:.parallelStream()
2、間接獲取:stream.parallel()

public class Dermo01Strema { public static void main(String[] args) { List<String> list1 = new ArrayList<String>(); Stream<String> strema1 = list1.stream().parallel(); Stream<String> strema2 = list1.parallelStream(); } }