使用jdk8 stream 統計單詞數

在個人SpringBoot2.0不容錯過的新特性 WebFlux響應式編程裏面,有同窗問如何使用stream統計單詞數。這是個好例子,也很典型,在這裏補上。html

下面的例子實現了從一個文本文件讀取(英文)文本並統計單詞數的功能。java

package com.imooc;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

/**
 * 使用stream統計文章單詞數
 * 
 * @author 曉風輕
 *
 */
public class StreamWordDemo {

  public static void main(String[] args) throws IOException {
    // 使用try-resource 關閉資源
    try (BufferedReader reader = new BufferedReader(
        new FileReader("webflux.txt"))) {

      long wordCount = reader.lines()
          // trim先後空格(使用方法引用)
          .map(String::trim)
          // 過濾掉空串
          .filter(s -> !s.isEmpty())
          // 把空格隔開的轉爲單詞數組
          .map(s -> s.split(" "))
          // 獲得數組長度
          .mapToInt(array -> array.length)
          // 並行(都是無狀態操做)
          .parallel()
          // 求和
          .sum();

      System.out.println("單詞數:" + wordCount);
    }
  }
}

  

牽涉的知識點主要仍是lambda表達式和stream的基本應用。你們能夠看出,使用stream編程代碼很是清晰和簡單,可讀性很強。react

下面獲取每一個單詞出現的次數git

    // 使用try-resource 關閉資源
    try (BufferedReader reader = new BufferedReader(
        new FileReader("webflux.txt"))) {

      Map<String, Long> counts = reader.lines()
          // trim先後空格(使用方法引用)
          .map(String::trim)
          // 過濾掉空串
          .filter(s -> !s.isEmpty())
          // 把空格隔開的轉爲數組
          .map(s -> s.split(" "))
          // 數組轉成流
          .map(array -> Stream.of(array))
          // 拉平
          .flatMap(stream -> stream)
          // 分組
          .collect(Collectors.groupingBy(s -> s, Collectors.counting()));

      System.out.println("單詞出現次數:" + counts);

      // 統計信息
      LongSummaryStatistics summaryStatistics = counts.entrySet().stream()
          // 獲得次數
          .mapToLong(entry -> entry.getValue())
          // 統計
          .summaryStatistics();

      System.out.println("統計信息:" + summaryStatistics);
    }
輸出的統計

  



信息爲:

統計信息:LongSummaryStatistics{count=170, sum=271, min=1, average=1.594118, max=14}github

能夠看出,一共有271個單詞,不一樣的詞有170個,出現最多的14次,最少1次,平均1.594118次。web

這就是stream的編程風格,其中lambda表達式是函數式編程的基礎,是後面的stream,reactor的前置基礎知識。對lambda表達式,stream流編程以及響應式編程webflux有更多興趣的能夠學習個人實戰課程 SpringBoot2.0不容錯過的新特性 WebFlux響應式編程,裏面有詳細的講解,課程乾貨滿滿,7小時只須要128元,海量的知識點的底層實現講解和本身動手編寫響應式的相似feign的restclient,絕對物超所值!spring

上面範例代碼github地址:stream流編程處理單詞編程


做者: 曉風輕 
連接:https://www.imooc.com/article/27508
來源:慕課網
本文原創發佈於慕課網 ,轉載請註明出處,謝謝合做數組

相關文章
相關標籤/搜索