使用jdk8 stream 統計單詞數


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

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

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編程代碼非常清晰和簡單,可讀性很強。

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

    // 使用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}

可以看出,一共有271個單詞,不同的詞有170個,出現最多的14次,最少1次,平均1.594118次。

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

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


作者: 曉風輕 
鏈接:https://www.imooc.com/article/27508
來源:慕課網
本文原創發布於慕課網 ,轉載請注明出處,謝謝合作


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM