一、特性
Java 8引入的Stream
API為集合(Collections)提供了一種聲明式的處理方式,支持豐富的操作,包括篩選、映射、歸約等。以下是一些Stream
的主要功能和使用方式的案例:
- 創建Stream:
List<String> list = Arrays.asList("apple", "banana", "orange");
Stream<String> streamFromCollection = list.stream();
Stream<String> streamFromValues = Stream.of("apple", "banana", "orange");
- 過濾(Filter):
List<String> filteredList = list.stream().filter(fruit -> fruit.startsWith("a")).collect(Collectors.toList());
System.out.println("Filtered List: " + filteredList);
- 映射(Map):
List<String> uppercasedList = list.stream().map(String::toUpperCase).collect(Collectors.toList());
System.out.println("Uppercased List: " + uppercasedList);
- 平坦化(FlatMap):
List<List<String>> nestedList = Arrays.asList(Arrays.asList("apple", "banana"),Arrays.asList("orange", "grape")
);List<String> flatMapList = nestedList.stream().flatMap(Collection::stream).collect(Collectors.toList());
// FlatMap List: [apple, banana, orange, grape]
System.out.println("FlatMap List: " + flatMapList);
- 篩選和截斷(Limit和Skip):
List<String> limitedList = list.stream().limit(2).collect(Collectors.toList());List<String> skippedList = list.stream().skip(1).collect(Collectors.toList());System.out.println("Limited List: " + limitedList);
System.out.println("Skipped List: " + skippedList);
- 排序(Sorted):
List<String> sortedList = list.stream().sorted().collect(Collectors.toList());
System.out.println("Sorted List: " + sortedList);
- 匹配(anyMatch、allMatch、noneMatch):
boolean anyStartsWithA = list.stream().anyMatch(fruit -> fruit.startsWith("a"));
boolean allStartWithA = list.stream().allMatch(fruit -> fruit.startsWith("a"));
boolean noneStartsWithZ = list.stream().noneMatch(fruit -> fruit.startsWith("z"));System.out.println("Any starts with 'a': " + anyStartsWithA);
System.out.println("All start with 'a': " + allStartWithA);
System.out.println("None starts with 'z': " + noneStartsWithZ);
- 歸約(Reduce):
將字符串列表中的所有元素連接成一個單一的字符串,以逗號和空格分隔。
Optional<String> concatenated = list.stream().reduce((s1, s2) -> s1 + ", " + s2);
concatenated.ifPresent(result -> System.out.println("Concatenated: " + result));
- 收集(Collect):
List<String> collectedList = list.stream().filter(fruit -> fruit.length() > 5).collect(Collectors.toList());Set<String> collectedSet = list.stream().filter(fruit -> fruit.length() > 5).collect(Collectors.toSet());String joinedString = list.stream().collect(Collectors.joining(", "));System.out.println("Collected List: " + collectedList);
System.out.println("Collected Set: " + collectedSet);
System.out.println("Joined String: " + joinedString);
這些例子展示了Stream
API的一些常見用法。Stream
提供了豐富的操作,使得對集合進行處理變得更加簡潔和表達力強。
二、解決問題
Stream
是 Java 8 引入的一種處理集合(Collections)數據的新方式,它主要解決了在集合上進行復雜操作時代碼的繁瑣性、可讀性差和性能問題。以下是一些 Stream
的優點和解決的問題,并附帶一些案例:
-
聲明式編程:
- 問題:傳統方式對集合的操作通常需要使用迭代器或者顯式的循環,導致代碼冗長且難以理解。
- 解決方案:
Stream
提供了聲明式的編程方式,可以更清晰地表達對集合的操作。
List<String> fruits = Arrays.asList("apple", "banana", "orange"); fruits.stream().filter(s -> s.startsWith("a")).forEach(System.out::println);
-
鏈式調用:
- 問題:在傳統方式中,對集合的多次操作需要多次迭代或多次循環,效率低下。
- 解決方案:
Stream
支持鏈式調用,可以在一次迭代中執行多個操作。
List<String> result = fruits.stream().filter(s -> s.startsWith("a")).map(String::toUpperCase).collect(Collectors.toList());
-
不可變性和延遲執行:
- 問題:傳統方式中的集合操作可能會改變原集合,或者在每一步都立即執行。
- 解決方案:
Stream
操作不會改變原集合,而是返回一個新的Stream
,并且操作是延遲執行的。
List<String> result = fruits.stream().filter(s -> s.startsWith("a")).map(String::toUpperCase).collect(Collectors.toList());
-
并行處理:
- 問題:在傳統方式中,手動編寫并行化代碼可能會很困難。
- 解決方案:
Stream
提供了簡便的方法來實現并行處理,提高了性能。
long count = fruits.parallelStream().filter(s -> s.startsWith("a")).count();
-
簡化聚合操作:
- 問題:傳統方式中聚合操作(如求和、平均值)需要編寫顯式的循環代碼。
- 解決方案:
Stream
提供了內置的聚合操作,簡化了這類操作。
double averageLength = fruits.stream().mapToInt(String::length).average().orElse(0);
這些案例展示了 Stream
如何解決傳統集合操作中的一些問題,并提供了更簡潔、清晰和高效的處理方式。通過使用 Stream
,代碼變得更加表達力強,可讀性更高,并且在某些情況下能夠更容易地實現并行化。