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

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

為什么我不能使用過濾器作為流中的最后一步

為什么我不能使用過濾器作為流中的最后一步

MMMHUHU 2023-08-16 10:49:16
我不斷被告知不通過諸如collect和findFirst之類的方法終止Stream是不好的做法,但沒有真正的反饋說明為什么在博客中沒有太多談論它??聪旅娴氖纠?,我沒有使用大量嵌套的 if 檢查,而是使用Optional 來獲取列表值。如您所見,我的最后一步是在該流中進行過濾。這對我來說按預期工作,即取回列表。為什么這是錯誤的,我應該如何寫呢?import lombok.Getter;import lombok.Setter;import java.util.*;public class Main {    public static void main(String[] args) {        RequestBean requestBean = new RequestBean();        // if I uncomment this I will get the list values printed as expected//        FruitBean fruitBean = new FruitBean();//        AnotherBean anotherBean = new AnotherBean();//        InnerBean innerBean = new InnerBean();//        requestBean.setFruitBeans(Collections.singletonList(fruitBean));//        fruitBean.setAnotherBeans(Collections.singletonList(anotherBean));//        anotherBean.setInnerBeans(Collections.singletonList(innerBean));//        List<String> beans = Arrays.asList("apple", "orange");//        innerBean.setBeans(beans);        List<String> result = getBeanViaOptional(requestBean);        if(result != null){            for(String s : result){                System.out.println(s);            }        }else {            System.out.println("nothing in list");        }    }    private static List<String> getBeanViaOptional(RequestBean bean){        Optional<List<String>> output = Optional.ofNullable(bean)                .map(RequestBean::getFruitBeans)                .map(n -> n.get(0))                .map(FruitBean::getAnotherBeans)                .map(n -> n.get(0))                .map(AnotherBean::getInnerBeans)                .map(n -> n.get(0))                .map(InnerBean::getBeans)                // why is this bad practice to end with a filter. how should I write this then?                .filter(n -> n.contains("apple"));        if(!output.isPresent()){            throw new CustomException();        }        return output.get();    }
查看完整描述

2 回答

?
弒天下

TA貢獻1818條經驗 獲得超8個贊

我不斷被告知不通過諸如collect和findFirst之類的方法終止Stream是不好的做法,但沒有真正的反饋說明為什么在博客中沒有太多談論它。

這實際上取決于上下文如果您說“我可以用中間操作結束流,例如filter而不調用終端操作(消耗流的操作) ”那么是的,這是不好的做法并且毫無意義,因為您只是定義了一些標準,但從未要求“結果”。

流是惰性的,因為它們不會執行任何操作,除非終端操作(例如 等)告知這樣collectfindFirst。

如果您說“從方法返回流是一種不好的做法嗎”,那么可能值得閱讀有關是否應該返回流或集合的答案。

此外,請注意您的getBeanViaOptional邏輯是在Optional<T>a 而不是上運行的Stream<T>。是的,它們都有mapflatMapfilter請注意, anOptional<T>只能包含一個值或者為,而流可以包含一個或多個值。

您使用Optional而不是命令式的方法if在可讀性、維護等方面顯然更好。所以我建議您繼續使用這種方法,盡管您可以使用orElseThrowie 來改進它:

return?Optional.ofNullable(bean)
???????????????.map(RequestBean::getFruitBeans)
???????????????.map(n?->?n.get(0))
???????????????.map(FruitBean::getAnotherBeans)
???????????????.map(n?->?n.get(0))
???????????????.map(AnotherBean::getInnerBeans)
???????????????.map(n?->?n.get(0))
???????????????.map(InnerBean::getBeans)
???????????????.filter(n?->?n.contains("apple"))
???????????????.orElseThrow(CustomException::new);


查看完整回答
反對 回復 2023-08-16
?
溫溫醬

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

對于流,當沒有終端操作時,通常不會執行任何中間操作。您的示例使用Optional. 它的操作mapfilter流中的一些中間操作同名,但又不同。您的示例在您的問題所詢問的行上是可以的(不錯的做法)。

另一件事是(正如 Aomine 已經指出的那樣).orElseThrow是獲取 中的值Optional并在沒有值時拋出異常的更短方法。更重要的是使用起來更安全.orElseThrow (或者.orElse如果有默認值)。Optional.get()應盡可能避免。NoSuchElementException如果沒有值,您將得到 a 。NullPointerException這幾乎和不使用時得到 a 一樣糟糕Optional。Optional以正確的方式使用可以保護您免受NullPointerException.


查看完整回答
反對 回復 2023-08-16
  • 2 回答
  • 0 關注
  • 145 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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