当前位置: 首页 > 知识库问答 >
问题:

java是如何实现的。util。流动流动独特的()方法有效吗?我可以重写对象流的equals()方法吗?

章振
2023-03-14

我的用例是,我试图使用不同的Stream方法从类对象列表中删除具有相同卷号的学生学生课程映射。Pojo详细信息如下

public class StudentCourseMapping implements Serializable{
    private String name;
    private String dept;
    private Integer roll;
    private String course;

下面是equals方法

    @Override
    public boolean equals(Object obj) {
        StudentCourseMapping other = (StudentCourseMapping) obj;
        if (roll == null) {
            if (other.roll != null)
                return false;
        } else if (!roll.equals(other.roll))
            return false;
        return true;
    }

下面是实现

public class RemoveDuplicateUsingStream {
    public static void main(String[] args) {
        List<StudentCourseMapping> studentCourceList = JacksonJSONReaderObjectMapper.jsonReader();
        
        studentCourceList.stream().distinct().forEach(System.out::println);
        StudentCourseMapping s0 = studentCourceList.get(0);
        StudentCourseMapping s1 = studentCourceList.get(1);
        System.out.println(s0.equals(s1));

        Set<Integer> st = new HashSet();
        List<StudentCourseMapping>studentCourceList2 = studentCourceList.stream().filter(s -> st.add(s.getRoll()))
                .collect(Collectors.toCollection(ArrayList::new));
        System.out.println(studentCourceList2.size());
    }
}

输出是

StudentCourseMapping [name=Alu, dept=Physics, roll=12, course=Quantum Theory]
StudentCourseMapping [name=Alu, dept=Physics, roll=12, course=English]
StudentCourseMapping [name=Sam, dept=Commerce, roll=16, course=English]
StudentCourseMapping [name=Sam, dept=Commerce, roll=16, course=Accounts]
StudentCourseMapping [name=Joe, dept=Arts, roll=19, course=English]
StudentCourseMapping [name=Joe, dept=Arts, roll=19, course=Hindi]
true
3

JacksonJSONReaderObjectMapper。jsonReader();是一个自定义方法,它读取下面的JSON。我可以通过使用过滤器和添加到哈希集来实现同样的效果,但我真的想知道我独特的实现有什么问题。

{
    "studentCourseMapping": [
        {
            "name": "Alu",
            "dept": "Physics",
            "roll": 12,
            "course": "Quantum Theory"
        },
        {
            "name": "Alu",
            "dept": "Physics",
            "roll": 12,
            "course": "English"
        },
        {
            "name": "Sam",
            "dept": "Commerce",
            "roll": 16,
            "course": "English"
        },
        {
            "name": "Sam",
            "dept": "Commerce",
            "roll": 16,
            "course": "Accounts"
        },
        {
            "name": "Joe",
            "dept": "Arts",
            "roll": 19,
            "course": "English"
        },
        {
            "name": "Joe",
            "dept": "Arts",
            "roll": 19,
            "course": "Hindi"
        }
    ]
}

当我尝试直接测试equals方法时,它工作正常并返回true,因为s0和s1都作为12滚动。

        StudentCourseMapping s0 = studentCourceList.get(0);
        StudentCourseMapping s1 = studentCourceList.get(1);
        System.out.println(s0.equals(s1));

但是当我使用distinct时,所有的对象都会被打印出来,并且在eclipse中调试时,我编写的distinct方法不会被调用。但文件上说它应该被调用。顺便说一句,我使用的是Oracle docs 8,但我使用的是JDK 11

Stream差异()返回一个流,该流由该流的不同元素(根据Object.equals(Object))组成。

共有1个答案

郦何平
2023-03-14

正如@RealSkeptic和@Jesper在评论中已经说过的,您确实必须覆盖学生课程映射中的hashCode方法,以便正确比较流中的元素,并且根据您的equals实现只保留不同的元素

虽然,这在Stream留档中没有提到,也没有在不同的留档中提到。我相信这被认为是暗示的,因为equals留档充分涵盖了在重写equals方法时遵守一般哈希码合约的义务。

请注意,每当重写hashCode方法时,通常都需要重写该方法,以便维护hashCode方法的一般约定,即相同的对象必须具有相同的哈希代码。

事实上,一旦hashCode()方法被覆盖,您的代码段就会产生所需的输出。

public class StudentCourseMapping implements Serializable {
    private String name;
    private String dept;
    private Integer roll;
    private String course;

    //... your class implementation ...

    @Override
    public boolean equals(Object obj) {
        if (obj == null) return false;
        if (obj == this) return true;
        if (obj.getClass() != getClass()) return false;
        StudentCourseMapping student = (StudentCourseMapping) obj;
        return Objects.equals(roll, student.roll);
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(roll);
    }

    @Override
    public String toString() {
        return String.format("[name = %s, dept = %s, roll = %d, course = %s]", name, dept, roll, course);
    }
}
 类似资料:
  • 当我在试验新的java-8 Stream时,我想看看它的方法是如何实现的,所以我看了一下Stream类的实现,发现所有的方法都是抽象的。 我的问题是像和这样的方法是如何工作的?必须在某个地方有具体的实现,这些方法在哪里?

  • 本文向大家介绍nginx 如何实现读写限流的方法,包括了nginx 如何实现读写限流的方法的使用技巧和注意事项,需要的朋友参考一下 nginx 读写限流 前段时间,开发了一个供外部调用的api,领导说要限流,请求单个IP,每秒50读次,写10次 万能的nginx,几行配置搞定 nginx -s reload 还是那句话,应用程序不需要关心,一句代码都不用动 感谢阅读,希望能帮助到大家,谢谢大家对本

  • 本文向大家介绍jQuery实现流动虚线框的方法,包括了jQuery实现流动虚线框的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了jQuery实现流动虚线框的方法。分享给大家供大家参考。具体分析如下: 在百度UEditor的首页看到一个流动的虚线框的效果,所以自己用jQuery尝试也写一个,效果如下: css: HTML: jQuery: 希望本文所述对大家的jQuery程序设计有所帮

  • 收集java时。util。流动流,为什么不调用其方法void close()?

  • 如果不向新的ArrayList中添加值,而只是更新原始列表,如何对此进行优化?