为了账号安全,请及时绑定邮箱和手机立即绑定

克服 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 关注
  • 244 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号