Java 8 引入了 Streams API,它允許我們以宣告性方式處理序列的資料。.stream()
是這一API的核心方法,用於從一個資料來源(如陣列、集合等)建立一個流(Stream)。以下是 .stream()
方法的一些基本使用介紹:
1. 從集合建立流
List<String> myList = Arrays.asList("a", "b", "c"); Stream<String> stream = myList.stream();
2. 從陣列建立流
String[] myArray = {"a", "b", "c"}; Stream<String> streamFromArray = Arrays.stream(myArray);
3. 並行流
如果你想要並行處理資料,可以使用 .parallelStream()
。
Stream<String> parallelStream = myList.parallelStream();
4. 中間操作
中間操作是從一個流到另一個流的惰性操作,不會立即執行,常見的中間操作包括:
filter(Predicate)
:過濾出符合條件的元素。map(Function)
:將每個元素轉換成另一種形式。distinct()
:去除重複的元素。sorted()
或sorted(Comparator)
:對流中的元素進行排序。
stream.filter(s -> s.startsWith("a")) .map(String::toUpperCase) .distinct() .sorted() .forEach(System.out::println);
5. 終端操作
終端操作是實際執行流操作的步驟,常見的終端操作包括:
forEach(Consumer)
:對流中的每個元素執行操作。count()
:返回流中元素的總數。reduce(T identity, BinaryOperator)
:將流中的元素透過某種方式合併成一個值。collect(Collector)
:將流中的元素收集到一個新集合。
long count = stream.filter(s -> s.startsWith("a")).count(); String joined = stream.map(String::toUpperCase).collect(Collectors.joining(", "));
6. 組合使用
流操作可以組合使用,先進行中間操作,然後執行終端操作。
int sum = myList.stream() .mapToInt(Integer::parseInt) .sum();
7. 使用 Optional 與 Stream
Optional
型別也可以轉換成流。
Optional<String> optional = Optional.of("Hello"); Stream<String> optionalStream = optional.stream();
注意事項
- 流操作是懶載入的,只有當終端操作被執行時,中間操作才會被實際執行。
- 流只能被遍歷一次,一旦執行了終端操作,流就會關閉。
- 使用並行流時,需要注意執行緒安全問題。
Streams API 提供了一種強大而靈活的方式來處理集合資料,使得程式碼更加簡潔和易於理解。