日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

lambdas for_Wordcounter,使用Lambdas和Fork / Join计算Java中的单词数

發布時間:2023/12/3 java 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 lambdas for_Wordcounter,使用Lambdas和Fork / Join计算Java中的单词数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

lambdas for

這些天來,我發布了Wordcounter ,這是一個Java庫和命令行實用程序,用于對文本文件中的單詞進行計數并對單詞計數進行分析,從而大量使用了功能編程結構和并行計算方法。 這是我在“令人討厭的快速問答”大賽第四個條目SAP ,經過給料機 , 托多爾和Hanoier 。

該庫使用JDK 8 lambda ,以及新的JDK 7功能,例如Fork / Join和NIO.2 。 它是內置的,只能與支持lambda的JDK 8的早期訪問版本一起使用 。

隨著JDK 8中lambda及其支持功能的引入,我們用Java構建軟件的方式將發生變化。 如果您想了解幾年后Java代碼的外觀,可以看看Wordcounter。 與當前大多數可用資源不同,這不是簡單的教程,而是一個實際的項目。

競賽任務要求使用Fork / Join和lambdas實現算法,該算法分析目錄中的所有文件并查找文件中十個最常用的單詞以及它們出現的次數。 我沒有簡單地堅持使用Fork / Join,而是嘗試找到最適合此任務的并行方法,這使我選擇了Producer / Consumer作為核心的單詞計數邏輯。

您可以在github上探索源代碼。 還有一個相當全面的自述文件,提供了更詳細的文檔。

最新的二進制,javadoc和源代碼包可在GitHub 下載部分中找到 。 如果有足夠的興趣,我將在線發布Javadoc,并在中央Maven存儲庫中提供該庫。

歡迎提供反饋,評論和貢獻!

總覽

圖書館特色

  • 計算字符串,單個文本文件或包含文本文件的目錄樹中的所有單詞。
  • 分析單詞計數以找到前N個最常用的單詞,后N個最不常用的單詞或總單詞數。
  • 通過外部謂詞指定字符是否為文字字符。
  • 指定要對單詞執行的可選操作,例如通過外部運算符轉換為小寫字母。
  • 在非并行和并行實現之間進行選擇,以比較其性能。
  • 如果需要,將并行度指定為與內核數不同的值。

編程要點

  • 使用生產者/使用者來讀取文件并并行計算每個文件中的單詞。 實際的機制封裝在通用的可重用實現中。
  • 使用Fork / Join對字數進行分析。 這里,實際的機制再次封裝在通用的可重用實現中。
  • 使用NIO.2遍歷目錄樹和讀取文件。
  • 大量使用函數接口和lambda表達式 ,以便在適當的地方傳遞函數而不是數據。
  • 有兩個最重要的類的綜合單元測試和性能測試。
  • 像往常一樣,該代碼干凈,結構合理且易于閱讀。 格式,命名和注釋是統一且一致的。 適當地使用了面向對象和功能編程技術已經引起了很多關注。

命令行界面

要啟動命令行程序,請執行以下命令:

java -jar wordcounter-1.0.4.jar <options>

所有選項都有合理的默認值,因此都不是必需的。 對所有選項使用默認值會導致在當前目錄及其子目錄中找到前10個最常用的單詞。 指定非默認值允許指定不同的目錄,分析模式,單詞字符,單詞數和并行度,以及忽略大小寫或使用串行而不是并行計算,例如:

在“單詞”目錄中找到最常用的10個單詞-p words
在目錄“ wordsx”中查找前5個最不常用的單詞,并將數字視為單詞字符,忽略大小寫,并進行信息記錄-p wordsx -m bottom -d 1234567890 -i -n 5 -l info

有關命令行界面選項的更多信息,請參見自述文件中的命令行界面 。

設計

庫的設計將問題劃分為通用并行處理實用程序,封裝用于表示原始字數和排序字數的數據結構的類,最后是使用前兩組功能執行計數和分析的類。 實際上,所有這些類都大量使用功能接口的實例,以便允許對其通用行為進行特定的自定義。 這導致代碼中大量注入了lambda表達式和方法引用。 歡迎來到Java函數編程的世界!

通用并行處理實用程序

ForkJoinComputer類

ForkJoinComputer<T>類是通用的Fork / Join計算機。 它將初始大小除以2,直到達到指定的并行度或低于指定的閾值,然后使用指定的Computer<T>串行計算每個部分,然后使用指定的Merger<T>所有計算的結果。 在這里,計算機和合并是定義如下的功能接口:

public interface Computer<T> {T compute(int lo, int hi); }public interface Merger<T> {T merge(T result1, T result2); }

可以通過簡單地使用適當的lambda實例化該類,然后調用其compute方法來使用此類。

new ForkJoinComputer<Integer>(n, 1000,(lo, hi) -> { int sum = 0; for (int i = lo + 1; i <= hi; i++) sum += i; return sum; },(a, b) -> a + b).compute();

ProducerConsumerExecutor類

ProducerConsumerExecutor<T1, T2>類是通用的Producer / Consumer執行程序。 它啟動一個Producer<T1>任務和多個Mediator<T1, T2>和Consumer<T2>任務,它們的數量等于指定的并行度。 生產者將T1實例放入BlockingQueue<T1> 。 中介者從那里獲取這些實例,將其轉換為T2 ,并將其放入另一個類型為BlockingQueue<T2>阻塞隊列中。 最后,使用者從第二個阻塞隊列中獲取T2實例并對其進行處理。

在這里, Producer, Consumer和Mediator是定義如下的功能接口:

public interface Producer<T> {void produce(Block<T> block); }public interface Consumer<T> {void consume(T t); }public interface Mediator<T1, T2> {void mediate(T1 t, Block<T2> block); }

在上面的代碼中, Block是java.util.functions定義的標準函數。 傳遞給Producer和Mediator方法的塊將產生的數據放入相應的阻塞隊列中。

與ForkJoinComputer相似,可以通過簡單地使用適當的lambda實例化該類,然后調用其execute方法來使用此類。

數據結構類

這些類封裝了用于表示原始和已排序字數的數據結構。

  • WordCounts類表示映射到其用法計數的單詞列表。
  • TopWordCounts類表示映射到所有具有此類計數的單詞的單詞使用情況計數的排序列表。

字數統計和分析類

WordCounter類

WordCounter類提供了一種方法,用于以串行或并行方式對表示文件或目錄樹的Path單詞進行計數。 只需使用適當的lambda實例化它,然后調用其count方法即可使用它:

// Count all words consisting of only alphabetic chars, ignoring case, using parallel processing WordCounts wc = new WordCounter(path, (c) -> Character.isAlphabetic(c), (s) -> s.toLowerCase(), true).count();

并行實現使用ProducerConsumerExecutor<Path, String> 。 生產者只需遍歷目錄樹并產生Path實例。 中介者將文件讀入文本片段,使用者將每個文本片段中的單詞計數,然后將它們收集到單個WordCounts實例中。 這是通過以下代碼完成的:

private WordCounts countPar() {final WordCounts wc = new WordCounts(parLevel);new ProducerConsumerExecutor<Path, String>((block) -> collectPaths(block),(file, block) -> readFileToBlock(file, block),(text) -> wc.add(countWords(text, pred, op)), parLevel).execute();return wc; }

WordCountAnalyzer類

WordCountAnalyzer類提供了對WordCounter產生的字數進行分析的方法,例如查找前N個最常用的字。 也可以通過簡單地實例化它,然后調用它的方法之一(例如findTop或total來使用它:

// Find the top 10 most used words in wc TopWordCounts twc = new WordCountAnalyzer(wc, true).findTop(10, (x, y) -> (y - x));

Differentnet分析類型實現內部Analysis<T>接口,該接口定義如下:

interface Analysis<T> {T compute(int lo, int hi);T merge(T r1, T r2); }

由于以上兩種方法的簽名模仿了ForkJoinComputer使用的Computer和Merger功能接口,因此我們可以通過以下方式對所有分析類型使用fork / join:

public TopWordCounts findTop(int number, Comparator<Integer> comparator) {return analyse(new FindTopAnalysis(number, comparator)); }private <T> T analyse(Analysis<T> a) {if (par) {return new ForkJoinComputer<T>(wc.getSize(), THRESHOLD, a::compute, a::merge, parLevel).compute();} else {return a.compute(0, wc.getSize());} }

有關庫設計的更多信息,請參見自述文件中的設計。

性能

我發現并行的Producer / Consumer字數統計實現很好地適應了不同數量的內核和I / O速度。 它比串行實現要快得多。 與之不同的是,當使用不切實際的大量唯一單詞進行測試時,并行的Fork / Join分析實現僅比串行的實現快,而且程度適中。 由于唯一字的數量很少,因此實際上比串行字慢。

下表比較了單詞計數的性能,并在以下情況下找到了最佳分析:

  • CPU AMD Phenom II X4 965 3.4 GHz(4核),4 GB RAM,Windows 7,JDK 8
  • 默認選項:由字母字符組成的單詞,區分大小寫
  • 默認并行度,等于內核數

字數統計性能

實作 檔案 話 大小(MB) 時間(毫秒)
序列號 1個 10000000 ?65 2200-2400
平行 1個 10000000 ?65 500-600
序列號 100 10000000 ?65 1600-1800
平行 100 10000000 ?65 500-600

查找最佳分析性能

實作 話 最大數量 最佳 時間(毫秒)
序列號 2000000 10000000 10 200-250
平行 2000000 10000000 10 200-250

玩代碼

如果您想使用這些代碼,我建議您使用最新的NetBeans 7.3 beta,在撰寫本文時為NetBeans IDE 7.3 Beta 2 。 請注意,即使在此版本中,也無法在IDE中編譯lambda,因此周圍到處都有紅色標記。 但是,從IDE啟動Maven構建并運行測試仍然可以正常工作。 根據此博客文章 ,應該可以對lambda使用IntelliJ IDEA 12 EAP內部版本122.202或更高版本,但是我沒有親自嘗試過。 我確實嘗試了Eclipse,但由于Eclipse使用了自己的對lambda無知的JDT編譯器,因此發現它是一場失敗的比賽。

結論

這是我第一次接觸Java函數編程。 盡管Java仍然不是Scala,但是與我以前的Java代碼相比,新的函數式編程結構大大改變了我設計和實現Wordcounter的方式。 我發現這種新的編程風格功能強大且富有表現力,我相信隨著Java 8的發布,它將很快成為主流。

對我來說,這也是最后的“怪異敏捷”任務。 評審團慷慨地授予了我的意見書,甚至在比賽結束之前,我就找到了自己的優勝者。

如果這篇文章引起了您的興趣,請隨時下載并探索Wordcounter,用它來學習新的Java函數編程構造,并讓我知道在這個過程中是否可以幫助您。

參考: Wordcounter,來自JCG合作伙伴 Stoyan Rachev的Lambdas和Fork / Join中的Java單詞計數在 Stoyan Rachev博客中。

翻譯自: https://www.javacodegeeks.com/2012/12/wordcounter-counting-words-in-java-with-lambdas-and-forkjoin.html

lambdas for

總結

以上是生活随笔為你收集整理的lambdas for_Wordcounter,使用Lambdas和Fork / Join计算Java中的单词数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。