2 回答

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超11個(gè)贊
[1, 3, 5, 7, 9]
的偶數(shù)下標(biāo)數(shù)組:
int[] i = new int[] {0}; System.out.println(Arrays.toString(IntStream.of(1, 3, 5, 7, 9).filter(n -> i[0]++ % 2 == 0).toArray()));
得到[1, 5, 9]

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超5個(gè)贊
這個(gè)要從為什么java8
會(huì)弄出stream
這種循環(huán)方式說起了
以前的for
循環(huán)是屬于外部循環(huán),由調(diào)用者自己顯式的取出每個(gè)元素加以處理,尤其是并行處理時(shí),非常痛苦
而stream是屬于內(nèi)部循環(huán),你可以無需關(guān)心它是如何循環(huán)的,要是并行的時(shí)候如何優(yōu)化,這些你都可以不管,你只需要簡簡單單告訴他需要做什么處理即可
舉個(gè)簡單的例子:
地上有很多乒乓球,爸爸要讓你兒子撿起來放到盒子里
如果是外部循環(huán),可能這種模式
爸爸:地上還有球么
兒子:有
爸爸:那把它撿起來放到盒子里,還有么?
兒子:有
爸爸:繼續(xù)撿起來放到盒子里,還有么?
兒子:有
爸爸:接著撿起來放到盒子里,還有么?
兒子:沒有了
爸爸:ok,收拾好了
如果是內(nèi)部循環(huán)
爸爸:把地上的球撿起來全部放到盒子里
兒子:好,完成
例子可能很牽強(qiáng),但是我們作為開發(fā)者,就是爸爸,只需要告訴兒子(JDK
)把球放進(jìn)盒子這個(gè)動(dòng)作就好,具體兒子怎么放,一次一個(gè)手拿一個(gè),還是一次每個(gè)手拿一個(gè),由它自己來思考,不需要我們?nèi)ブ笓],我們只關(guān)注具體需要做的事就好
所以說stream是一種內(nèi)部循環(huán),你不需要去關(guān)注下標(biāo)...關(guān)注下標(biāo)的話,從某種意義上來說,還是外部循環(huán)的思想在處理了,當(dāng)然題主的問題中,明確就是要求是關(guān)注下標(biāo)了,貌似好像stream
是沒法寫似的
其實(shí)不然,寫肯定能寫的,只是說換一種方式而已,不把下標(biāo)當(dāng)成循環(huán)用的元素,而是把它與具體需要循環(huán)的數(shù)字綁定起來,寫出來差不多是這個(gè)樣子
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1,3,5,7,9);
Map<Boolean, List<Integer>> collect = IntStream.rangeClosed(1, list.size())
.boxed()
// 把數(shù)字和下標(biāo)綁定起來
.map(i -> mapToEntry(i, list.get(i-1)))
// 按照下標(biāo)是否能被2整除進(jìn)行分組
.collect(Collectors.partitioningBy(simpleEntry -> Integer.parseInt(simpleEntry.getKey().toString()) % 2 == 0,
Collectors.mapping(Map.Entry::getValue, Collectors.toList())));
// 偶數(shù)列表 3,9
List<Integer> evenList = collect.get(Boolean.TRUE);
// 奇數(shù)列表 1,5,7
List<Integer> oddList = collect.get(Boolean.FALSE);
}
private static AbstractMap.SimpleEntry<Integer, Integer> mapToEntry(Integer i, Integer integer) {
return new AbstractMap.SimpleEntry(i, integer);
}
添加回答
舉報(bào)