一、什麼是stream
Stream(流)是一個來自數據源的元素隊列並支持聚合操作,數據來源可以從inputstream,數組,集合中獲取;聚合操作可以類似SQL語句一樣的操作, 比如filter, map, reduce, find, match, sorted等。
二、stream基本方法的使用
public class StreamRefer { public List<String> names = new ArrayList<>(); /** * 流獲取方式 */ @Test public void testGetStream(){ //流的獲取 names.add("zhangsan"); names.add("lisi"); names.add("wangwu"); //方式一:通過集合的stream方法獲取 Stream stream1 = names.stream(); System.out.println(stream1); //方式二:通過stream的of方法獲取 Stream stream2 = Stream.of(names); System.out.println(stream2); //方式三:通過parallelStream來創建並行流 Stream stream = names.parallelStream(); System.out.println(stream); } /** * 流的方法測試 */ @Test public void testStreamMethodForeach(){ names.add("zhangsan"); names.add("lisi"); names.add("wangwu"); Stream<String> nameStream = names.stream(); //void forEach(Consumer action)對流進行循環操作,輸入一個參數,無參數輸出,無法流式編程 nameStream.forEach(s-> System.out.println(s.toUpperCase())); } @Test public void testStreamMethodFilter(){ names.add("zhangsan"); names.add("lisi"); names.add("wangwu"); Stream<String> nameStream = names.stream(); //filter(Predicate p) 返回一個與給定判斷條件匹配的元素組成的流,接受一個輸入參數,返回一個booleal值,可以流式編程 nameStream.filter(s->s.length()>4).forEach(System.out::println); } @Test public void testStreamMethodCount(){ names.add("zhangsan"); names.add("lisi"); names.add("wangwu"); Stream<String> nameStream = names.stream(); //count() 返回一個參數流的個數 System.out.println(nameStream.count()); } @Test public void testStreamMethodLimit(){ names.add("zhangsan"); names.add("lisi"); names.add("wangwu"); Stream<String> nameStream = names.stream(); /* * Stream limit(long maxSize) 獲得流中前 maxSize 個元素,將元素添加到另一個流中返回 *如果 maxSize 大於等於當前流的元素個數,則所有元素都會獲取到 *如果 maxSize 等於 0,則會獲得一個空流。 *可以流式編程 */ //1.獲取前面幾個流,當爲0是爲空流但不會爲null Stream<String> limitStream = nameStream.limit(0); System.out.println(limitStream); limitStream.forEach(System.out::println); //2.獲取前面幾個流,當爲大於size返回整個流 Stream<String> limitStreamWhole = nameStream.limit(5); limitStreamWhole.forEach(System.out::println); //3.獲取前面幾個流,當爲小於於size大於0返回整個流 Stream<String> limitStreamPart = nameStream.limit(2); limitStreamPart.forEach(System.out::println); } @Test public void testStreamMethodSkip(){ names.add("zhangsan"); names.add("lisi"); names.add("wangwu"); Stream<String> nameStream = names.stream(); //跳過前面幾個,可以流式編程 nameStream.skip(1).forEach(System.out::println); } @Test public void testStreamMethodMap(){ names.add("zhangsan"); names.add("lisi"); names.add("wangwu"); List<String> values = new ArrayList<>(); values.add("張三"); values.add("李四"); Stream<String> nameStream = names.stream(); Stream<String> valueStream = values.stream(); // Stream concat(Stream a,Stream b)兩個流合併返回一個新的流 Stream.concat(nameStream,valueStream).forEach(System.out::println); } @Test public void testStreamMethodConcat(){ names.add("zhangsan"); names.add("lisi"); names.add("wangwu"); Stream<String> nameStream = names.stream(); //map(Function mapper) 該接口需要一個 Function 函數式接口參數,可以將當前流中的 T 類型數據轉換爲另一種 R 類型的流。 nameStream.map(name -> name.length()).forEach(System.out::println); } @Test public void testStreamMethodSort(){ names.add("zhangsan"); names.add("lisi"); names.add("wangwu"); Stream<String> nameStream = names.stream(); //sorted(Comparator<? super T> comparator)排序 nameStream.map(name -> name.length()).sorted().forEach(System.out::println); } @Test public void testStreamMethodCollect(){ names.add("zhangsan"); names.add("lisi"); names.add("wangwu"); //collect(toList())將流轉成集合 List<Integer> convertCoinTypes = names.stream().map(coinType -> coinType.length()).collect(toList()); convertCoinTypes.forEach(System.out::println); } }
三、stream總結
注意點:①在流式編程中一樣需要符合lambda表達式對域的規範;
②流式編程可以簡化我們的編碼風格。