JAVA8你只需要知道這些(4)

     

    java8的Stream寫法,讓你告別For循環,快點學習起來吧!讓你的代碼更加的簡潔!非常喜歡啊!!!



  1. package Stream;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5. import java.util.Optional;  
  6. import java.util.UUID;  
  7. import java.util.stream.Collectors;  
  8. import java.util.stream.Stream;  
  9.   
  10. public class TestStream {  
  11.     private List<String> stringList = new ArrayList<String>();  
  12.     /** 
  13.      * 初始化字符串列表 
  14.      */  
  15.     private void initStringList() {  
  16.         stringList.add("zzz1");  
  17.         stringList.add("aaa2");  
  18.         stringList.add("bbb2");  
  19.         stringList.add("fff1");  
  20.         stringList.add("fff2");  
  21.         stringList.add("aaa1");  
  22.         stringList.add("bbb1");  
  23.         stringList.add("zzz2");  
  24.     }  
  25.   
  26.     /** 
  27.      * Filter接受一個predicate接口類型的變量,並將所有流對象中的元素進行過濾。該操作是一箇中間操作, 
  28.      * 因此它允許我們在返回結果的基礎上再進行其他的流操作 
  29.      * (forEach)。ForEach接受一個function接口類型的變量,用來執行對每一個元素的操作 
  30.      * 。ForEach是一箇中止操作。它不返回流,所以我們不能再調用其他的流操作 
  31.      */  
  32.     public void useStreamFilter() {  
  33.         // stream()方法是Collection接口的一個默認方法  
  34.         // Stream<T> filter(Predicate<? super T>  
  35.         // predicate);filter方法參數是一個Predicate函數式接口並繼續返回Stream接口  
  36.         // void forEach(Consumer<? super T> action);foreach方法參數是一個Consumer函數式接口  
  37.   
  38.         // 解釋:從字符串序列中過濾出以字符a開頭的字符串並迭代打印輸出  
  39.         stringList.stream().filter((s) -> s.startsWith("a")).forEach(System.out::println);  
  40.     }  
  41.     /** 
  42.      * Sorted是一箇中間操作,能夠返回一個排過序的流對象的視圖。流對象中的元素會默認按照自然順序進行排序, 
  43.      * 除非你自己指定一個Comparator接口來改變排序規則. 
  44.      * 
  45.      * <p> 
  46.      * 一定要記住,sorted只是創建一個流對象排序的視圖,而不會改變原來集合中元素的順序。原來string集合中的元素順序是沒有改變的 
  47.      */  
  48.     public void useStreamSort() {  
  49.         // Stream<T> sorted();返回Stream接口  
  50.         // 另外還有一個 Stream<T> sorted(Comparator<? super T>  
  51.         // comparator);帶Comparator接口的參數  
  52.         stringList.stream().sorted().filter((s) -> s.startsWith("a")).forEach(System.out::println);  
  53.   
  54.         // 輸出原始集合元素,sorted只是創建排序視圖,不影響原來集合順序  
  55.         stringList.stream().forEach(System.out::println);  
  56.     }  
  57.     /** 
  58.      * map是一個對於流對象的中間操作,通過給定的方法,它能夠把流對象中的每一個元素對應到另外一個對象上。 
  59.      * 下面的例子就演示瞭如何把每個string都轉換成大寫的string. 
  60.      * 不但如此,你還可以把每一種對象映射成爲其他類型。對於帶泛型結果的流對象,具體的類型還要由傳遞給map的泛型方法來決定。 
  61.      */  
  62.     public void useStreamMap() {  
  63.         // <R> Stream<R> map(Function<? super T, ? extends R> mapper);  
  64.         // map方法參數爲Function函數式接口(R_String,T_String).  
  65.   
  66.         // 解釋:將集合元素轉爲大寫(每個元素映射到大寫)->降序排序->迭代輸出  
  67.         // 不影響原來集合  
  68.         stringList.stream().map(String::toUpperCase).sorted((a, b) -> b.compareTo(a)).forEach(System.out::println);  
  69.     }  
  70.     /** 
  71.      * 匹配操作有多種不同的類型,都是用來判斷某一種規則是否與流對象相互吻合的。所有的匹配操作都是終結操作,只返回一個boolean類型的結果 
  72.      */  
  73.     public void useStreamMatch() {  
  74.         // boolean anyMatch(Predicate<? super T> predicate);參數爲Predicate函數式接口  
  75.         // 解釋:集合中是否有任一元素匹配以'a'開頭  
  76.         boolean anyStartsWithA = stringList.stream().anyMatch((s) -> s.startsWith("a"));  
  77.         System.out.println(anyStartsWithA);  
  78.   
  79.         // boolean allMatch(Predicate<? super T> predicate);  
  80.         // 解釋:集合中是否所有元素匹配以'a'開頭  
  81.         boolean allStartsWithA = stringList.stream().allMatch((s) -> s.startsWith("a"));  
  82.         System.out.println(allStartsWithA);  
  83.   
  84.         // boolean noneMatch(Predicate<? super T> predicate);  
  85.         // 解釋:集合中是否沒有元素匹配以'd'開頭  
  86.         boolean nonStartsWithD = stringList.stream().noneMatch((s) -> s.startsWith("d"));  
  87.         System.out.println(nonStartsWithD);  
  88.     }  
  89.   
  90.     /** 
  91.      * Count是一個終結操作,它的作用是返回一個數值,用來標識當前流對象中包含的元素數量 
  92.      */  
  93.     public void useStreamCount() {  
  94.         // long count();  
  95.         // 解釋:返回集合中以'a'開頭元素的數目  
  96.         long startsWithACount = stringList.stream().filter((s) -> s.startsWith("a")).count();  
  97.         System.out.println(startsWithACount);  
  98.   
  99.         System.out.println(stringList.stream().count());  
  100.     }  
  101.     /** 
  102.      * 該操作是一個終結操作,它能夠通過某一個方法,對元素進行削減操作。該操作的結果會放在一個Optional變量裏返回。 
  103.      */  
  104.     public void useStreamReduce() {  
  105.         // Optional<T> reduce(BinaryOperator<T> accumulator);  
  106.         // @FunctionalInterface public interface BinaryOperator<T> extends  
  107.         // BiFunction<T,T,T> {  
  108.   
  109.         // @FunctionalInterface public interface BiFunction<T, U, R> { R apply(T  
  110.         // t, U u);  
  111.         Optional<String> reduced = stringList.stream().sorted().reduce((s1, s2) -> s1 + "#" + s2);  
  112.   
  113.         // 解釋:集合元素排序後->reduce(削減 )->將元素以#連接->生成Optional對象(其get方法返回#拼接後的值)  
  114.         reduced.ifPresent(System.out::println);  
  115.         System.out.println(reduced.get());  
  116.     }  
  117.     /** 
  118.      * 使用並行流 
  119.      * <p> 
  120.      * 流操作可以是順序的,也可以是並行的。順序操作通過單線程執行,而並行操作則通過多線程執行. 可使用並行流進行操作來提高運行效率 
  121.      */  
  122.     public void useParallelStreams() {  
  123.         // 初始化一個字符串集合  
  124.         int max = 1000000;  
  125.         List<String> values = new ArrayList<>();  
  126.   
  127.         for (int i = 0; i < max; i++) {  
  128.             UUID uuid = UUID.randomUUID();  
  129.             values.add(uuid.toString());  
  130.         }  
  131.   
  132.         // 使用順序流排序  
  133.   
  134.         long sequenceT0 = System.nanoTime();  
  135.         values.stream().sorted();  
  136.         long sequenceT1 = System.nanoTime();  
  137.   
  138.         // 輸出:sequential sort took: 51921 ms.  
  139.         System.out.format("sequential sort took: %d ms.", sequenceT1 - sequenceT0).println();  
  140.   
  141.         // 使用並行流排序  
  142.         long parallelT0 = System.nanoTime();  
  143.         // default Stream<E> parallelStream() {  
  144.         // parallelStream爲Collection接口的一個默認方法  
  145.         values.parallelStream().sorted();  
  146.         long parallelT1 = System.nanoTime();  
  147.   
  148.         // 輸出:parallel sort took: 21432 ms.  
  149.         System.out.format("parallel sort took: %d ms.", parallelT1 - parallelT0).println();  
  150.   
  151.         // 從輸出可以看出:並行排序快了一倍多  
  152.     }  
  153.   
  154.     public void userCollectStream(){  
  155.         //將  
  156.         Stream<String> stream=Stream.of("a","b","c","d");  
  157.         List<String> list=stream.collect(Collectors.toList());  
  158.         list.forEach(str->System.out.println(str));  
  159.     }  
  160.     public static void main(String[] args) {  
  161.         TestStream example = new TestStream();  
  162.   
  163. //        example.useStreamFilter();  
  164. //        example.useStreamMap();  
  165. //        example.useStreamMatch();  
  166. //        example.useStreamCount();  
  167. //        example.useStreamReduce();  
  168. //        example.useParallelStreams();  
  169.         example.userCollectStream();  
  170.     }  
  171. }  

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