Java SE 8 流庫
1. 流的作用
通過使用流,說明想要完成什麽任務,而不是說明如何去實現它,將操作的調度留給具體實現去解決;
實例:假如我們想要計算某個屬性的平均值,那麽我們就可以指定數據源和屬性,然後,流庫就可以對計算進行優化;
1.1. 從叠代到流的操作
1.1.1. java.nio.file深度剖析
從java.nio.file提供的功能不難看出已經可以替換java.io.file所提供的功能;
1.1.1.1. java.nio.file的主要功能
1:對文件系統本身的操作,例如文件的復制,移除,刪除,創建功能,創建軟連接。
2:對文件系統的屬性的進行操作,例如查看或修改 文件屬性、操作權限、所屬用戶或用戶組、最後修改時間,查看文件是否隱藏、文件的長度。
3:對文件系統進行遍歷。
4:使用nio的方式查看和改變文件內容。
5:對文件或文件夾的創建,刪除,修改事件進行監控。
1.1.1.2. java.nio.file提供常用方法
1:復制文件
copy(Path source,Path target,CopyOption... options) throws IOException
2:創建目錄
createDirectories(Path dir,FileAttribute<?>... attrs) throws IOException
3:創建文件,path代表文件路徑
createFile(Path path,FileAttribute<?>... attrs) throws IOException
4:創建連接,link代表目標連接,existing代表一個存在的文件
createLink(Path link,Path existing)throws IOException
5:刪除文件
delete(Path path); deleteIfExists(Path path)
6:獲取文件的BufferReader,BufferWriter
newBufferedReader(Path path, Charset cs), newBufferedWriter(Path path, Charset cs, OpenOption... options)
7:獲取文件的InputStream,OutputStream
newInputStream(Path path, OpenOption... options),newOutputStream(Path path, OpenOption... options)
8:以字節和字符串形式讀取文件
readAllBytes(Path path),readAllLines(Path path, Charset cs)
1.1.2. 實例
需求:對文檔中的長單詞進行計數
1.1.3. 傳統方法
1 import java.nio.charset.StandardCharsets; 2 import java.nio.file.Files; 3 import java.nio.file.Paths; 4 import java.util.Arrays; 5 import java.util.List; 6 7 /** 8 * Created by Lenovo on 2017/12/14. 9 * 對文件中的長單詞進行計數 10 */ 11 public class Demo01 { 12 13 private static final String filePath = "G:\\Idea\\src\\com\\itheima05\\Test_JavaSE\\Test_20171214\\word.txt"; 14 15 public static void main(String[] args) throws Exception { 16 17 //使用集合的方法實現 18 String contens = new String(Files.readAllBytes(Paths.get(filePath)), StandardCharsets.UTF_8); 19 String[] ws = contens.split("\\PL+"); 20 //將數組轉化為List集合 21 List<String> words = Arrays.asList(ws); 22 int count = 0; 23 for(String word:words){ 24 if(word.length()>6){ 25 count ++; 26 } 27 } 28 System.out.println(count); 29 } 30 }
1.1.4. 使用流處理
java.util.Collection<E>:
default Stream<E> stream() ----- 產生當前集合中所有元素的順序流
default Stream<E> parallelStream() ----- 產生當前集合中所有元素的並行流
1 import java.nio.charset.StandardCharsets; 2 import java.nio.file.Files; 3 import java.nio.file.Paths; 4 import java.util.Arrays; 5 import java.util.List; 6 7 /** 8 * Created by Lenovo on 2017/12/14. 9 * 使用流對文檔中的長單詞進行計數 10 * 11 */ 12 public class Demo02 { 13 14 private static final String filePath = "G:\\Idea\\src\\com\\itheima05\\Test_JavaSE\\Test_20171214\\word.txt"; 15 16 public static void main(String[] args) throws Exception { 17 18 String contents = new String(Files.readAllBytes(Paths.get(filePath)), StandardCharsets.UTF_8); 19 20 String[] ws = contents.split("\\PL+"); 21 //將數組轉化為集合 22 List<String> words = Arrays.asList(ws); 23 //使用流 24 //Stream<T> filter(Predicate<? super T> predicate) 產生一個流,其中包含當前流中滿足P的所有元素 25 //long count() 產生當前流中元素的數量,這個是一個終止操作 26 long count = words.stream() 27 .filter(w -> w.length() > 6) 28 .count(); 29 System.out.println("順序流輸出:"+count); 30 31 long count02 = words.parallelStream() 32 .filter(w -> w.length()>6) 33 .count(); 34 System.out.println("並行流輸出:"+count02); 35 36 } 37 }
流的主要思想是:做什麽而非怎麽做;
以上實例:需要統計文檔中的長度為6的單詞
1.1.5. 流和集合的區別
1:流並不存儲其元素;
2:流的操作不會修改其數據源
3:流的操作是盡可能惰性執行的
1.1.6. 流的操作流程
1:創建一個流
2:指定將初始流轉化為其他流的中間操作,可能包含多個步驟(filter,產生新的流);
3:應用終止操作,從而產生結果
Java SE 8 流庫