當使用Java集合時,我們使用外部迭代。
在外部迭代中,我們?yōu)槊總€循環(huán)使用for或,或者為序列中的集合的集合和過程元素獲取迭代器。
以下代碼計算列表中所有奇整數(shù)的平方和。
它使用每個循環(huán)訪問列表中的每一個元素,然后使用if語句來過濾奇整數(shù)。
之后,它計算平方,最后存儲平方和與和變量。
import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); int sum = 0; for (int n : numbers) { if (n % 2 == 1) { int square = n * n; sum = sum + square; } } System.out.println(sum); } }
上面的代碼生成以下結(jié)果。
我們可以使用stream重寫上面的代碼。 它做的完全一樣。
import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); int sum = numbers.stream() .filter(n -> n % 2 == 1) .map(n -> n * n) .reduce(0, Integer::sum); System.out.println(sum); } }
在上面的代碼中,我們沒有使用循環(huán)語句來遍歷List。 我們通過流在內(nèi)部執(zhí)行循環(huán)。
對于奇整數(shù)計算,我們使用lambda表達式。 我們首先做了過濾,然后映射然后減少。
上面的代碼生成以下結(jié)果。
外部迭代通常意味著順序代碼。順序代碼只能由一個線程執(zhí)行。
流被設計為并行處理元素。
以下代碼并行計算列表中奇整數(shù)的平方和。
import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); int sum = numbers.parallelStream() .filter(n -> n % 2 == 1) .map(n -> n * n) .reduce(0, Integer::sum); System.out.println(sum); } }
我們做的只是用parallelStream()替換stream()。
使用流提供的內(nèi)部迭代時,并行計算很容易。
上面的代碼生成以下結(jié)果。
在命令式編程中,我們不僅控制要做什么,還要如何做。
例如,當使用命令性編程來對列表中的整數(shù)求和時。 我們必須決定如何迭代列表中的每個元素。 我們可以使用for循環(huán),for-each循環(huán),或者我們可以從list中獲取一個Iterator對象,并使用while循環(huán)。 然后我們也要做總和。
在聲明性編程中,我們只需要告訴該做什么,該部分如何由系統(tǒng)本身處理。
集合支持命令式編程,而流支持聲明式編程。
Streams API通過使用lambda表達式支持函數(shù)式編程。
我們要對流元素執(zhí)行的操作通常通過傳遞lambda表達式完成。
流上的操作產(chǎn)生結(jié)果而不修改數(shù)據(jù)源。
流支持兩種類型的操作:
中間操作也稱為惰性操作。
終端操作也稱為急切操作。
惰性操作不處理元素,直到在流上調(diào)用熱切操作。
流上的中間操作產(chǎn)生另一流。
Streams鏈接操作以創(chuàng)建流管道。
在下面的代碼中filter()和map()都是惰性操作。 而reduce()是急切的操作。
import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); int sum = numbers.parallelStream() .filter(n -> n % 2 == 1) .map(n -> n * n) .reduce(0, Integer::sum); System.out.println(sum); } }
上面的代碼生成以下結(jié)果。
更多建議: