第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

在Java流中,PEEK真的只用于調(diào)試嗎?

在Java流中,PEEK真的只用于調(diào)試嗎?

達(dá)令說 2019-06-26 17:14:26
在Java流中,PEEK真的只用于調(diào)試嗎?我正在閱讀有關(guān)Java流的內(nèi)容,并在進(jìn)行過程中發(fā)現(xiàn)新的東西。我發(fā)現(xiàn)的新發(fā)現(xiàn)之一是peek()功能。我在peek上讀到的幾乎所有東西都說它應(yīng)該用來調(diào)試您的流。如果我有一個(gè)Stream,其中每個(gè)帳戶都有一個(gè)用戶名、密碼字段和一個(gè)login()和loggedIn()方法。我也有Consumer<Account> login = account -> account.login();和Predicate<Account> loggedIn = account -> account.loggedIn();為什么會這么糟?List<Account> accounts; //assume it's been setupList<Account> loggedInAccount = accounts.stream()     .peek(login)     .filter(loggedIn)     .collect(Collectors.toList());據(jù)我所知,這完全是它想要做的。它;接受一個(gè)帳戶列表嘗試登錄到每個(gè)帳戶過濾掉任何未登錄的帳戶將登錄帳戶收集到新列表中。做這種事有什么壞處?有什么理由不讓我繼續(xù)嗎?最后,如果不是這個(gè)解決方案,那又是什么呢?最初的版本使用了.filter()方法,如下所示;.filter(account -> {         account.login();         return account.loggedIn();     })
查看完整描述

3 回答

?
慕娘9325324

TA貢獻(xiàn)1783條經(jīng)驗(yàn) 獲得超4個(gè)贊

其中的關(guān)鍵是:

不要以意外的方式使用API,即使它實(shí)現(xiàn)了您的直接目標(biāo)。這種方法將來可能會中斷,而且對未來的維護(hù)人員來說也是不清楚的。


將其分解為多個(gè)操作是無害的,因?yàn)樗鼈兪遣煌牟僮鳌D抢?/trans>以一種不明確和意外的方式使用API的危害,如果這種特定的行為在Java的未來版本中被修改,可能會產(chǎn)生影響。

使用forEach在此操作中,將向維護(hù)人員清楚地表明預(yù)定的每一個(gè)元素的副作用accounts,并且您正在執(zhí)行一些可以使其發(fā)生變異的操作。

從某種意義上講,這也是比較傳統(tǒng)的peek是一個(gè)中間操作,在終端操作運(yùn)行之前不會對整個(gè)集合進(jìn)行操作,但是forEach確實(shí)是終點(diǎn)站。這樣,您就可以圍繞您的行為和代碼流提出強(qiáng)有力的論點(diǎn),而不是問有關(guān)以下問題的問題:peek會表現(xiàn)得和forEach在這種情況下。

accounts.forEach(a -> a.login());List<Account> loggedInAccounts = accounts.stream()
                                         .filter(Account::loggedIn)
                                         .collect(Collectors.toList());


查看完整回答
反對 回復(fù) 2019-06-26
?
夢里花落0921

TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超6個(gè)贊

也許經(jīng)驗(yàn)法則應(yīng)該是,如果您確實(shí)在“調(diào)試”場景之外使用了peek,那么只有在確定終止和中間過濾條件是什么的情況下,才應(yīng)該這樣做。例如:

return list.stream().map(foo->foo.getBar())
                    .peek(bar->bar.publish("HELLO"))
                    .collect(Collectors.toList());

在您想要的情況下,似乎是一個(gè)有效的情況,在一個(gè)操作中,將所有foos轉(zhuǎn)換為條形圖,并向他們問好。

看起來比這樣更有效率和優(yōu)雅:

List<Bar> bars = list.stream().map(foo->foo.getBar()).collect(Collectors.toList());bars.forEach(bar->bar.publish("HELLO"));return bars;

而且你不會重復(fù)一個(gè)集合兩次。


查看完整回答
反對 回復(fù) 2019-06-26
  • 3 回答
  • 0 關(guān)注
  • 745 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號