对象和索引流
我本來(lái)要寫(xiě)一篇關(guān)于如何將流與每個(gè)元素的索引混合的文章,但是Baeldung上的人們已經(jīng)很好地涵蓋了這個(gè)主題 ! 鑒于我是他們編輯團(tuán)隊(duì)的一員,我為他們/我們感到自豪。
有趣的是,特別是Streams中的Java函數(shù)式編程如何使我們脫離了一些常見(jiàn)的模式。 例:
List<Foo> foos = new ArrayList<>(); for (int i=0; i < bars.size(); i++) {foos.add(new Foo(i, bars.get(i)); }上面的代碼從索引創(chuàng)建一個(gè)新的Foo ,從源列表創(chuàng)建一個(gè)bar 。
當(dāng)Stream.collect是一個(gè)更大的信號(hào),我們要從迭代中提取數(shù)據(jù)時(shí),我們不喜歡在for循環(huán)中間使用add 。 同樣,當(dāng)我們可以在流聲明中更明確地表示有效的Stream.map時(shí),我們不希望將其隱藏在循環(huán)中。 我們都知道以上內(nèi)容應(yīng)讀為:
List<Foo> foos = bars.stream().map( ... something ...).collect(toList());尷尬的挑戰(zhàn)是某些事情不容易完成。
如何選擇做什么
總體而言,圍繞流操作編寫(xiě)復(fù)雜的功能清單是一種隱藏流要向我們展示的東西的方法,即,數(shù)據(jù)如何從一個(gè)地方轉(zhuǎn)到另一個(gè)地方。
所以這是一些想法:
- 也許只有一個(gè)for循環(huán)–可能會(huì)更容易
- 如果您發(fā)現(xiàn)操作主體中的主要參與者是索引,那么請(qǐng)進(jìn)行一系列索引,并在最后一分鐘將對(duì)象與List.get混合,假設(shè)您的列表已被有效索引
- 如果主要玩家是一個(gè)對(duì)象,則可以存儲(chǔ)一個(gè)計(jì)數(shù)器( AtomicInteger是一個(gè)不錯(cuò)的選擇)并在最后一刻增加它,注意排序和并行流
- 如果代碼變得復(fù)雜,請(qǐng)嘗試通過(guò)提取函數(shù)來(lái)將流邏輯與業(yè)務(wù)邏輯分離
- 也許將其委托給一個(gè)圖書(shū)館-Baeldung的文章展示了ProtonPack和其他可能更好的東西,它們已經(jīng)過(guò)測(cè)試和記錄。
無(wú)論您做什么,都不要從原則上使自己變得困難。
翻譯自: https://www.javacodegeeks.com/2019/08/object-index-streams.html
總結(jié)
- 上一篇: 什么叫素数 素数的定义
- 下一篇: 数据结构栈的知识_数据知识栈