1. 程式人生 > >Java SE 8 流庫

Java SE 8 流庫

16px exists 常用 路徑 inpu 監控 可能 完成 int

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 流庫