我的用例是,我试图使用不同的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))组成。
正如@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中添加值,而只是更新原始列表,如何对此进行优化?