java8學習:使用流(2)

內容來自《 java8實戰 》,本篇文章內容均爲非盈利,旨爲方便自己查詢、總結備份、開源分享。如有侵權請告知,馬上刪除。
書籍購買地址:java8實戰

  • 接上一篇內容:java8學習:使用流(1)
  • 數值流

    • 我們之前提到過int和Integer是有對應的函數式接口的,比如IntPredicate,IntFunction。其目的就是爲了省去拆箱裝箱的步驟。
    • Stream也有對應的IntStream,LongStream和DoubleStream
    • 原來我們求和是這樣的

      int[] is = {1,2,3,4,5,6,7,8,9};
      Arrays.stream(is).reduce(0,Integer::sum);//45  
      //現在
      int[] is = {1,2,3,4,5,6,7,8,9};
      LongStream longStream = Arrays.stream(is).mapToLong(i -> i);
      longStream.sum();
      //如上mapToLong將Stream轉換爲longStream,在這個longStream中就默認實現了關於數字簡化操作的sum方法
      //轉換爲double那麼就可以是mapToDouble
    • 將數值流轉換回對象流(Stream):boxed()

      Stream<Long> boxed = longStream.boxed();
  • 數值範圍

    IntStream.range(1,10).forEach(System.out::print);//123456789
    IntStream.rangeClosed(1,10).forEach(System.out::print);//12345678910
    • range不包含最後一個值的數字範圍
    • rangeClosed包含最後一個值的數字範圍
    • 只有IntStream和LongStream有這倆靜態方法
  • 構建流

    • 我們之前都是從數組和集合中構建的stream,下面我們將瞭解一下其他的構建流的方式
    • 由值創建流

      Stream<String> stream = Stream.of("1","3");
      //空流
      Stream<String> empty = Stream.empty();
    • 數組創建流省略
    • 由文件創建流

      Files.lines(Paths.get("log4j.properties"), Charset.forName("UTF-8"))
         .forEach(System.out::println);  //會輸出文件的所有的內容
      //Files.lines可以根據參數得到一個流,每一行就是一個元素
    • 無限流的創建

      • :就比如數字的產生,數字是根據表達式產生的,所以這個表達式一直運行就會一直產生數字,所以數字是無窮盡的
    • iterate創建

      Stream<Integer> iterate = Stream.iterate(0, a -> a + 1);
      iterate.limit(10).forEach(System.out::print);
    • 如上limit限制了個數要麼就一直計算下去了,iterate是根據表達式來生成無限流的(不要嘗試無limit,我的IDEA卡死了)
    • generate創建

      Stream<Double> generate = Stream.generate(Math::random);
      generate.limit(10).forEach(System.out::println); //十個隨機數
      • generate就不再需要表達式了,而是需要一個函數式接口:Supplier,定義如下
    @FunctionalInterface
    public interface Supplier<T> {
      T get();
    }
    • 需要注意的是上面的Stream.generate等操作會引起裝箱拆箱問題,可以使用對應值類型的Stream即可
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章