亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

在Java流中,PEEK真的只用于調試嗎?

在Java流中,PEEK真的只用于調試嗎?

達令說 2019-06-26 17:14:26
在Java流中,PEEK真的只用于調試嗎?我正在閱讀有關Java流的內容,并在進行過程中發現新的東西。我發現的新發現之一是peek()功能。我在peek上讀到的幾乎所有東西都說它應該用來調試您的流。如果我有一個Stream,其中每個帳戶都有一個用戶名、密碼字段和一個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());據我所知,這完全是它想要做的。它;接受一個帳戶列表嘗試登錄到每個帳戶過濾掉任何未登錄的帳戶將登錄帳戶收集到新列表中。做這種事有什么壞處?有什么理由不讓我繼續嗎?最后,如果不是這個解決方案,那又是什么呢?最初的版本使用了.filter()方法,如下所示;.filter(account -> {         account.login();         return account.loggedIn();     })
查看完整描述

3 回答

?
慕娘9325324

TA貢獻1783條經驗 獲得超4個贊

其中的關鍵是:

不要以意外的方式使用API,即使它實現了您的直接目標。這種方法將來可能會中斷,而且對未來的維護人員來說也是不清楚的。


將其分解為多個操作是無害的,因為它們是不同的操作。那里以一種不明確和意外的方式使用API的危害,如果這種特定的行為在Java的未來版本中被修改,可能會產生影響。

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

從某種意義上講,這也是比較傳統的peek是一個中間操作,在終端操作運行之前不會對整個集合進行操作,但是forEach確實是終點站。這樣,您就可以圍繞您的行為和代碼流提出強有力的論點,而不是問有關以下問題的問題:peek會表現得和forEach在這種情況下。

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


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

TA貢獻1772條經驗 獲得超6個贊

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

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

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

看起來比這樣更有效率和優雅:

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

而且你不會重復一個集合兩次。


查看完整回答
反對 回復 2019-06-26
  • 3 回答
  • 0 關注
  • 752 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號