當(dāng)使用Java集合時(shí),我們使用外部迭代。
在外部迭代中,我們?yōu)槊總€(gè)循環(huán)使用for或,或者為序列中的集合的集合和過(guò)程元素獲取迭代器。
以下代碼計(jì)算列表中所有奇整數(shù)的平方和。
它使用每個(gè)循環(huán)訪問(wèn)列表中的每一個(gè)元素,然后使用if語(yǔ)句來(lái)過(guò)濾奇整數(shù)。
之后,它計(jì)算平方,最后存儲(chǔ)平方和與和變量。
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重寫(xiě)上面的代碼。 它做的完全一樣。
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); } }
在上面的代碼中,我們沒(méi)有使用循環(huán)語(yǔ)句來(lái)遍歷List。 我們通過(guò)流在內(nèi)部執(zhí)行循環(huán)。
對(duì)于奇整數(shù)計(jì)算,我們使用lambda表達(dá)式。 我們首先做了過(guò)濾,然后映射然后減少。
上面的代碼生成以下結(jié)果。
外部迭代通常意味著順序代碼。順序代碼只能由一個(gè)線程執(zhí)行。
流被設(shè)計(jì)為并行處理元素。
以下代碼并行計(jì)算列表中奇整數(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)部迭代時(shí),并行計(jì)算很容易。
上面的代碼生成以下結(jié)果。
在命令式編程中,我們不僅控制要做什么,還要如何做。
例如,當(dāng)使用命令性編程來(lái)對(duì)列表中的整數(shù)求和時(shí)。 我們必須決定如何迭代列表中的每個(gè)元素。 我們可以使用for循環(huán),for-each循環(huán),或者我們可以從list中獲取一個(gè)Iterator對(duì)象,并使用while循環(huán)。 然后我們也要做總和。
在聲明性編程中,我們只需要告訴該做什么,該部分如何由系統(tǒng)本身處理。
集合支持命令式編程,而流支持聲明式編程。
Streams API通過(guò)使用lambda表達(dá)式支持函數(shù)式編程。
我們要對(duì)流元素執(zhí)行的操作通常通過(guò)傳遞lambda表達(dá)式完成。
流上的操作產(chǎn)生結(jié)果而不修改數(shù)據(jù)源。
流支持兩種類(lèi)型的操作:
中間操作也稱(chēng)為惰性操作。
終端操作也稱(chēng)為急切操作。
惰性操作不處理元素,直到在流上調(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é)果。
更多建議: