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