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

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

克服 equals() 的不太可能的參數類型的優雅方法:Stream<String> 似乎與

克服 equals() 的不太可能的參數類型的優雅方法:Stream<String> 似乎與

鴻蒙傳說 2022-06-23 20:17:31
在將任何 Wrapper 對象與 Stream 進行比較時,我正在尋找一種優雅的方法來克服。Github 工作鏈接:https ://github.com/vishwaratna/Unlikely-argument-type-for-equals-Stream-String-/commit/d803f77c923e81fe7531ecb467561ac785d7aca5參考中的問題:在 java-8 中過濾從映射到列表屬性的鍵最近我在將成員List與 a 的鍵進行比較時遇到了它Map。我知道還有其他方法可以在不做我正在做的事情的情況下進行比較,但如果可以的話,我正在尋找一般的演員表。List<student> stulist = Arrays.asList(new student("1", "vishwa",null),                                              new student("3", "Ravi",null),                                              new student("2", "Ram",null));        Map<String,String> map = new HashMap() {{             put("1","20");             put("2","30");           }};System.out.println( stulist.stream()                    .filter(s->s.getId()                    .equals(map.entrySet()                    .stream()                     .map(Map.Entry::getKey)))                    .count());我的代碼正在正確編譯,但輸出為"0",而我希望輸出為2。我確定這是由于類型不匹配,但為什么編譯器沒有 拋出錯誤?警告我得到: Unlikely argument type for equals(): Stream<String> seems to be unrelated to String
查看完整描述

3 回答

?
小怪獸愛吃肉

TA貢獻1852條經驗 獲得超1個贊

基本上,要了解為什么編譯器不會出錯,您應該查看String.equals()方法實現


    public boolean equals(Object anObject) {

        if (this == anObject) {

            return true;

        }

        if (anObject instanceof String) {

            String anotherString = (String)anObject;

            int n = value.length;

            if (n == anotherString.value.length) {

                char v1[] = value;

                char v2[] = anotherString.value;

                int i = 0;

                while (n-- != 0) {

                    if (v1[i] != v2[i])

                        return false;

                    i++;

                }

                return true;

            }

        }

        return false;

    }

現在,讓我們回到這一行:


s.getId().equals(map.entrySet().stream().map(Map.Entry::getKey))

我們知道s.getId()is 的 typeString和map.entrySet().stream().map(Map.Entry::getKey)is 的 type Stream<String>。


由于Stream<String>is notinstanceof String,很明顯每次與String.equals()方法比較時都會返回(因此,最后計數為0 )。并且編譯器不會發出錯誤,因為實際上沒有發生任何非法事件(考慮到 的實現)。falses.getId()map.entrySet().stream().map(Map.Entry::getKey)String.equals()


count此外,可能,在沒有警告的情況下找到最干凈的方法是:


System.out.println(

  stulist.stream()

         .map(Student::getId)

         .filter(map::containsKey)

         .count());


查看完整回答
反對 回復 2022-06-23
?
慕容708150

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

首先,您可能想要的可能是:


System.out.println(stulist.stream()

        .filter(s -> map.keySet().contains(s.getId()))

        .count());

其次,equals在您的代碼中使用的比較是不正確的,因為它在兩種不同類型的對象之間String和Stream<String>。


// here the 's.getId' is a String while 'map.entrySet()...map()' provides 'Stream<String>'

.filter(s -> s.getId().equals(map.entrySet().stream().map(Map.Entry::getKey)))


查看完整回答
反對 回復 2022-06-23
?
喵喔喔

TA貢獻1735條經驗 獲得超5個贊

您可以使用map.containsKey避免在每個學生條目的條目集上運行流:

long count = stulist.stream().map(student::getId).filter(map::containsKey).count();

您收到警告是因為檢測到您正在測試String.equals(Stream<String>),這當然很可能是一個錯誤(在您的示例中,它肯定是)。

如果您要使用當前的邏輯,則正確的檢查必須是:

long count = stulist.stream()
                .filter(s -> map.entrySet()
                                .stream()
                                .map(Map.Entry::getKey)
                                .anyMatch(s.getId()::equals))
                .count();


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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