支持順序和並行聚合操作的一系列元素。
看一個JAVA 8_API(地址:https://www.matools.com/api/java8)的示例:
int sum = widgets.stream()
.filter(w -> w.getColor() == RED)
.mapToInt(w -> w.getWeight())
.sum();分析:widgets
是Collection<Widget>,通過
Collection.stream()
創建一個Widget
對象的流,.filter()——
過濾這個流以產生僅包含紅色小部件的流(這個過濾,我覺得換成保留較好,
filter()
就是保留滿足方法內條件的數據),然后過濾保留后的值,通過mapToInt方法轉換為表示每個紅色小部件的權重的
int
值。 然后將該流相加以產生總重量。
除了Stream
,其為對象引用的流,存在原語特為IntStream
,LongStream
和DoubleStream
,所有這些都稱為“流”和符合此處描述的特征和限制。
用途:對集合元素進行篩選、排序和聚合等。
和以前的Collection操作不同, Stream操作還有兩個基礎的特征:
- Pipelining: 中間操作都會返回流對象本身。 這樣多個操作可以串聯成一個管道, 如同流式風格(fluent style)。 這樣做可以對操作進行優化, 比如延遲執行(laziness)和短路( short-circuiting)。
- 內部迭代: 以前對集合遍歷都是通過Iterator或者For-Each的方式, 顯式的在集合外部進行迭代, 這叫做外部迭代。 Stream提供了內部迭代的方式, 通過訪問者模式(Visitor)實現。
實例:
public static void main(String[] args) { List<String> strings = Arrays.asList("aa","","bbbb","","cc","","dddd"); List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5,1,2,9,132); System.out.println("java 8 操作數組-------"); System.out.println("數組:" + strings); Long nullCount = strings.stream() .filter(s -> s.isEmpty()) .count(); List<String> nullStrings = strings.stream() .filter(s -> s.isEmpty()) .collect(Collectors.toList()); System.out.println("空字符串的數量:" + nullCount); System.out.println("空字符串:" + nullStrings); Long threeCount = strings.stream() .filter(s -> s.length()>3) .count(); List<String> threeStrings = strings.stream() .filter(s -> s.length()>3) .collect(Collectors.toList()); System.out.println("長度大於三的字符串的數量:" + threeCount); System.out.println("長度大於三的字符串:" + threeStrings); String joinStrings = strings.stream() .filter(s -> s.length()>3) .collect(Collectors.joining(",")); System.out.println("合並字符串:" + joinStrings); //獲取平方數 System.out.println("數字 數組------------------"); List<Integer> squaresList = numbers.stream() .map(integer -> integer*integer) .distinct() //去重 .collect(Collectors.toList()); System.out.println("獲取平方數:" + squaresList); IntSummaryStatistics statistics = numbers.stream() .mapToInt(s->s) .summaryStatistics(); System.out.println("列表中最大的數 : " + statistics.getMax()); System.out.println("列表中最小的數 : " + statistics.getMin()); System.out.println("所有數之和 : " + statistics.getSum()); System.out.println("平均數 : " + statistics.getAverage()); System.out.println("隨機數: "); Random random = new Random(); random.ints().limit(10).sorted().forEach(System.out::println); // 並行處理 List<String> parallelString = strings.parallelStream().filter(string -> !string.isEmpty()).collect(Collectors.toList()); System.out.println("空字符串的數量為: " + parallelString); }
輸出結果:
java 8 操作數組-------
數組:[aa, , bbbb, , cc, , dddd]
空字符串的數量:3
空字符串:[, , ]
長度大於三的字符串的數量:2
長度大於三的字符串:[bbbb, dddd]
合並字符串:bbbb,dddd
數字 數組------------------
獲取平方數:[9, 4, 49, 25, 1, 81, 17424]
列表中最大的數 : 132
列表中最小的數 : 1
所有數之和 : 169
平均數 : 15.363636363636363
隨機數:
-1605871186
-930090087
-760378224
-160815069
-155865019
-78365962
795529794
909733837
1127503219
1774549966
空字符串的數量為: [aa, bbbb, cc, dddd]
Process finished with exit code 0