列表流和feed流_通过流而不是列表
列表流和feed流
開幕式免責(zé)聲明:這并不總是一個(gè)好主意。 我將介紹這個(gè)想法,以及為什么它是一個(gè)好主意的一些原因,但隨后我將討論一些不太理想的實(shí)例。
懶惰
如您所知,我在Python中的學(xué)習(xí)幾乎和在Java中一樣。 我一發(fā)現(xiàn)Python就很喜歡生成器。 它們?cè)试S對(duì)集合執(zhí)行延遲操作,因此您可以傳遞迭代器/生成器,直到最終真正需要這些操作的最終結(jié)果–而不影響原始集合(在大多數(shù)情況下;但您不太可能意外影響它)。
我真的很喜歡這個(gè)主意。 懶惰使您幾乎不需要做任何工作,直到需要結(jié)果為止,而且還可以做到這一點(diǎn),因此不會(huì)有無用的內(nèi)存來存儲(chǔ)中間集合。
懶于Java
Java也有迭代器,但沒有迭代器。 但是,對(duì)于集合的惰性操作,它確實(shí)具有與之相當(dāng)相似的功能: Stream 。 盡管不像Python中的生成器那樣通用,但Stream基本上可以以相同的方式使用。
繞過溪流
在很多情況下,您應(yīng)該返回Stream而不是返回的List (或其他集合)。 這不僅為您提供了一些懶惰的好處,還為您做了一些事情。
如果返回對(duì)象的接收者希望將其collect()放入您計(jì)劃返回的List之外的其他東西,或者他們希望以您從未想到的方式來reduce()它,則可以給他們提供Stream而不必?fù)?dān)心。 然后,他們可以通過一兩個(gè)Stream方法調(diào)用來獲得所需的內(nèi)容。
對(duì)此有什么不好
當(dāng)Stream像集合一樣傳遞時(shí),存在一個(gè)很難解決的問題:它們是一次性使用的。 這意味著,如果下面的一個(gè)函數(shù)想要使用Stream而不是List ,那么它就不容易做到,因?yàn)樗枰褂肔ist分別做兩件事。
public static List normalize(List input) {int total = input.stream().mapToInt(i -> i).sum();return input.stream().map(i -> i * 100 / total).collect(Collectors.toList()); }為了接收Stream ,您需要collect()它,然后在其上運(yùn)行兩個(gè)操作。
public static Stream normalize(Stream input) {List inputList = input.collect(Collectors.toList());int total = inputList.stream().mapToInt(i -> i).sum();return inputList.stream().map(i -> i * 100 / total); }這稍微違反了傳遞Stream的目的。 這并不可怕,因?yàn)槲覀冋趪L試使用Stream的“最終”結(jié)果。 除了不是最終結(jié)果。 這是中間結(jié)果,用于計(jì)算下一個(gè)Stream輸出。 它創(chuàng)建了浪費(fèi)內(nèi)存的中間集合。
圍繞此問題有很多方法,類似于該“文章”的解決方法,但是它們要么實(shí)現(xiàn)起來很復(fù)雜,要么容易出現(xiàn)用戶錯(cuò)誤。 我猜想只使用我向您展示的第二種方法是可以的,因?yàn)榕c第一種方法相比,它仍然可能有相當(dāng)不錯(cuò)的性能提升,但這使我感到煩惱。
有趣(但可能有點(diǎn)傻)的選擇
如果您熟悉我的文章,您可能會(huì)覺得本文與我前段時(shí)間寫的有關(guān)使用decorator轉(zhuǎn)換集合的文章背道而馳 。 從技術(shù)上講,這篇文章確實(shí)認(rèn)為這是一個(gè)相當(dāng)幼稚的想法,特別是因?yàn)樵撓敕ㄊ鞘躍tream啟發(fā)的。 但是,與本文中介紹的Stream的想法相比,裝飾器的想法有一個(gè)主要好處:您可以一次又一次地遍歷裝飾的集合。 它的效率可能不如Stream ,特別是因?yàn)槲也淮_定如何并行化它,但是它肯定具有重用性。
我有機(jī)會(huì)再次研究這個(gè)想法,看看是否可以找到一種更好的方法來實(shí)現(xiàn),但是我對(duì)此表示懷疑。
奧托羅
所以,那是我的主意。 您可以選擇接受或保留它。 我不確定這在典型項(xiàng)目中有用的頻率,但是我想我將在當(dāng)前和將來的項(xiàng)目中嘗試一下。 謝謝閱讀。 如果您對(duì)此有意見,請(qǐng)?jiān)谙旅嬖u(píng)論,并讓我知道。
翻譯自: https://www.javacodegeeks.com/2015/02/pass-streams-instead-of-lists.html
列表流和feed流
總結(jié)
以上是生活随笔為你收集整理的列表流和feed流_通过流而不是列表的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 企业提前复工备案表怎么填(企业提前复工备
- 下一篇: linux硬盘分区命令(linux 硬盘