在我的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
來源:慕課網
本文原創發布於慕課網 ,轉載請注明出處,謝謝合作
