亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java函數式編程(十一):遍歷目錄

2019-11-26 15:24:23
字體:
來源:轉載
供稿:網友

列出目錄中的文件

用File類的list()方法可以很容易的列出目錄中的所有文件的文件名。如果想要獲取文件而不止是文件名的話,可以使用它的listFiles()方法。這很簡單,難的是怎么去處理這個返回的列表。我們不再使用傳統的冗長的外部迭代器,而是使用優雅的函數式來實遍歷這個列表。這里我們還得用到JDK的新的CloseableStream接口以及一些相關的高階函數。

下面這段代碼可以列出當前目錄下所有文件的名字。

復制代碼 代碼如下:

Files.list(Paths.get("."))
     .forEach(System.out::println);

如果想列出別的目錄的話,可以把”.”替換成想要訪問的目錄的完整路徑。

這里先是使用了Paths的get()方法,通過一個字符串創建了一個Path實例。然后通過Files工具類的list()方法獲取到了一個ClosableStream對象,我們可以用它來遍歷目錄下的所有文件。然后我們使用內部迭代器forEach()來打印出文件名。我們先來看下這段代碼的部分輸出結果:列出當前目錄下的文件及子目錄。

復制代碼 代碼如下:

./aSampleFiles.txt
./bin
./fpij
...

如果我們只想獲取當前目錄的子目錄,而不要文件的話,可以使用filter()方法:

復制代碼 代碼如下:

Files.list(Paths.get("."))
     .filter(Files::isDirectory)
     .forEach(System.out::println);

ilter()方法將目錄從文件流中篩選出來。我們把Files類的isDirectory方法的引用傳了進去,而不是傳遞一個lambda表達式?;叵胂耭ilter()方法它需要的是一個返回boolean值的Predicate類型,這個方法正好合適。最后我們用一個內部迭代器來打印出目錄的名字。程序將會打印出當前目錄的子目錄。

復制代碼 代碼如下:

./bin
./fpij
./output
...

這樣寫簡單多了,跟Java老的寫法相比省了不少代碼。下面我們來看下如何列出匹配某個模式的文件。

列出目錄下指定的文件

Java很早前就提供了一個list()方法的變種,用來篩選文件名。這個版本的list()方法接受一個FilenameFilter類型的參數。這個接口只有一個accept()方法,它接受兩個參數:File dir(代表目錄),以及String name(代表文件名)。accept()方法返回true的話這個文件名就會出現在返回的列表中,返回false則不在。我們來實現一下這個方法。

習慣性的做法是將一個實現了FilenameFilter接口的匿名內部類的實例傳給list()方法。比如說,我們來看下如何用這種方式來返回fpij目錄下的.java文件。

復制代碼 代碼如下:

final String[] files =
new File("fpij").list(new java.io.FilenameFilter() {
public boolean accept(final File dir, final String name) {
return name.endsWith(".java");
}
});
System.out.println(files);

這著實得費些工夫寫幾行代碼。這樣的代碼太聒噪了:創建對象,調用函數,定義匿名內部類,在類里面嵌入方法等等。我們不用再忍受這樣的痛苦了,只需傳一個接受兩個參數并返回bollean的lambda表達式進去就好了。Java編譯器會搞定剩下的事。

前面那個例子可以簡單的用一個lambda表達式替換掉匿名內部就好了,但是還有進一步優化的空間。新的DirectoryStream工具可以幫助我們更高效的遍歷大的目錄結構。我們來試下這種方法。這是newDirectoryStream()方法的一個變種,它接受一個額外的過濾器。

復制代碼 代碼如下:

Files.newDirectoryStream(
      Paths.get("fpij"), path -> path.toString().endsWith(".java"))
     .forEach(System.out::println);

這樣我們去掉了匿名內部類并把繁瑣的代碼變得簡潔明了。這兩個版本的輸出結果是一樣的。我們來打印下指定的文件。

這段代碼只會輸出指定目錄下的.java文件,下面是它的部分輸出結果:

復制代碼 代碼如下:

fpij/Compare.java
fpij/IterateString.java
fpij/ListDirs.java
...

我們基于文件名來篩選文件,同樣也可以很容易通過文件屬性,比如文件是不是可執行文件,是否可讀,可寫等來進行篩選。這么做的話得需要一個listFiles()方法,它接受一個FileFilter類型的參數。我們仍然使用lambda表達式來實現而不是去創建匿名內部類。現在來看一個列出當前目錄下所有隱藏文件的例子。

復制代碼 代碼如下:

final File[] files = new File(".").listFiles(file -> file.isHidden());

如果我們操作的是一個很大的目錄,可以使用DirectoryStream而不是直接調用File上面的方法。

我們傳給listFiles()方法的lambda表達式的簽名和FileFilter接口的accept()方法的簽名是一樣的。這個lambda表達式接受的是一個File實例的參數,在這個例子中參數名是file。如果文件是隱藏屬性的話,剛返回true,否則返回false.

這里其實還可以再精簡下代碼,我們不傳lambda表達式了,傳一個方法引用會讓代碼看起來會更簡潔一些 :

復制代碼 代碼如下:

new File(".").listFiles(File::isHidden);

我們先用lambda表達式實現,隨后又使用方法引用將它重構得更加簡潔。如果我們再寫新的代碼的話,當然應該采用這種簡潔的方式。如果可以早點發現這種簡潔的實現,我們當然要優先使用它。有一句話叫做”先讓它能工作,然后再去優化(make it work, then make it better)",先讓代碼能跑起來,等我們理清楚了,才去考慮簡潔性和性能等進行優化。

我們通過一個例子來從目錄中過濾出了指定的文件。下面我們來看下如何去遍歷指定目錄下的子目錄。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国精产品一区一区三区有限在线| 日本视频久久久| 国产美女精品免费电影| 91久久国产精品91久久性色| 亚洲精品xxxx| 国产精品网站大全| 久久久久www| 亚洲欧美国产日韩天堂区| 色偷偷av亚洲男人的天堂| 欧美一性一乱一交一视频| 亚洲精品国产综合区久久久久久久| 精品久久久久久亚洲国产300| 久久琪琪电影院| 国产丝袜视频一区| 亚洲一区制服诱惑| 国产裸体写真av一区二区| 亚洲国产欧美一区二区三区久久| 国产成人福利视频| 日韩av在线电影网| 久久91亚洲人成电影网站| 97精品伊人久久久大香线蕉| 精品久久久91| 欧美亚洲另类在线| 欧美国产一区二区三区| 国产日本欧美视频| 欧美日韩日本国产| 日韩一区二区在线视频| 国产91精品久| 在线观看日韩www视频免费| 久久躁日日躁aaaaxxxx| 中文字幕亚洲无线码a| 亚洲激情小视频| 久久久免费观看| 久久久之久亚州精品露出| 北条麻妃一区二区三区中文字幕| 日韩av免费看| 亚洲aⅴ日韩av电影在线观看| 欧美成人sm免费视频| 精品欧美一区二区三区| 日韩在线视频观看| 欧美激情精品久久久久久| 国产精品扒开腿做爽爽爽视频| 国产美女久久久| 欧美有码在线观看视频| 伦伦影院午夜日韩欧美限制| 欧美高清无遮挡| 国产成人精品av在线| 亚洲激情视频网站| 亚洲精品国产成人| 亚洲精品乱码久久久久久金桔影视| 久久久久中文字幕2018| 欧洲亚洲女同hd| 国产日韩欧美中文在线播放| 九九久久综合网站| 国产专区欧美专区| 日韩欧美中文字幕在线观看| 日韩av网站在线| 久久久久久国产精品三级玉女聊斋| 欧美激情在线有限公司| 久久99视频免费| 伊人伊人伊人久久| 性色av一区二区三区在线观看| 少妇高潮久久77777| 久久久久久久久91| 日韩美女激情视频| 久久中文字幕一区| 日韩精品免费在线视频观看| 中文字幕日韩av电影| 伊人伊成久久人综合网小说| 91社区国产高清| 亚洲最新中文字幕| 国产欧美一区二区三区在线| 最新日韩中文字幕| 精品国内产的精品视频在线观看| 精品色蜜蜜精品视频在线观看| 欧美亚州一区二区三区| 91色琪琪电影亚洲精品久久| 亚洲电影免费观看高清完整版在线| 欧美理论片在线观看| 国产精品99一区| 精品一区电影国产| 九九精品在线观看| 中文一区二区视频| 亚洲精品美女在线观看| 亚洲欧美一区二区激情| 国产一区香蕉久久| 日韩最新在线视频| 欧美成人国产va精品日本一级| 精品中文字幕视频| 久久亚洲电影天堂| 亚洲天堂免费观看| 伊人伊成久久人综合网站| 亚洲精品国产精品乱码不99按摩| 国产精品久久久久久一区二区| 国产香蕉97碰碰久久人人| xxxx欧美18另类的高清| 亚洲成人黄色网址| 国产精品美女无圣光视频| 国产欧美精品久久久| 国产视频精品一区二区三区| 国模私拍一区二区三区| 青青草原一区二区| 欧美极品少妇xxxxⅹ喷水| 国产精品专区第二| 亚洲最新av在线网站| 成人在线一区二区| 欧美刺激性大交免费视频| 91久久久久久国产精品| 91探花福利精品国产自产在线| 久久精品91久久香蕉加勒比| 日韩在线观看你懂的| 中文综合在线观看| 色妞色视频一区二区三区四区| 久久免费精品日本久久中文字幕| 亚洲性猛交xxxxwww| 亚洲日本成人女熟在线观看| 亚洲成色777777在线观看影院| 在线播放日韩欧美| 国产福利精品av综合导导航| 精品亚洲精品福利线在观看| 日韩欧美高清视频| 久久夜色撩人精品| 亚洲免费中文字幕| 亚洲欧洲午夜一线一品| 国产精品爽爽ⅴa在线观看| 国产成人在线亚洲欧美| 国产成人黄色av| 伦伦影院午夜日韩欧美限制| 亚洲美女免费精品视频在线观看| 亚洲精品免费在线视频| 亚洲а∨天堂久久精品喷水| 色噜噜亚洲精品中文字幕| 日韩欧美亚洲国产一区| 久久久综合免费视频| 亚洲精品国产精品国自产观看浪潮| 国产精品一区二区av影院萌芽| 最新中文字幕亚洲| 国产成人精品在线| 美女视频久久黄| 亚洲国产天堂久久综合网| 亚洲香蕉av在线一区二区三区| 亚州精品天堂中文字幕| 一区二区福利视频| 日韩在线播放视频| 日韩中文字在线| 亚洲欧美国产精品久久久久久久| 91午夜在线播放| 国产97在线亚洲| 欧美日韩精品二区| 国产一区二区欧美日韩| 亚洲国产黄色片| 欧美极品第一页| 日本视频久久久| 成人性生交大片免费看视频直播| 亚洲成人a**站| 96sao精品视频在线观看| 欧美性猛xxx| 亚洲综合色av| 亚洲精品一区二区网址| 久热精品视频在线观看一区| 精品国偷自产在线| 日本一区二区不卡| 日韩h在线观看| 午夜精品蜜臀一区二区三区免费|