1 重点:
1.1 去重demo
1.2 当使用对象的distinct方法时:需要重写equals和hashcode方法(用lombok的标签@Data@AllArgsConstructor不需要重写方法):
1.3 equals和hashcode的必要关系
两个对象相等,hashcode一定相等
两个对象不等,hashcode不一定不等
hashcode相等,两个对象不一定相等
hashcode不等,两个对象一定不等
2 去重demo
查找demo需求:
数据库中有些标签,xml中有些标签,求再xml中存在且数据库中不存在的去重后的标签
测试类:
package com.imooc.zhangxiaoxi.stream.cases; import com.google.common.collect.Lists; import lombok.AllArgsConstructor; import lombok.Data; import org.junit.Before; import org.junit.Test; import java.util.List; /** * 类名称:CaseTwo * ******************************** * <p> * 类描述:案例二 * 重点讲解:filter和distinct的使用方式 * * @author zhangxiaoxi * @date 下午9:39 */ public class CaseTwo { /** * 用户请求的创建标签模型 */ /*@Data @AllArgsConstructor*/ class TagReqDTO { /** * 标签名字 */ private String name; /** * 标签值:年龄 */ private Integer age; @Override public String toString() { return "TagReqDTO{" + "name='" + name + '\'' + ", age=" + age + '}'; } public TagReqDTO(String name, Integer age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } //重写equals要实现hachCode() @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((name == null) ? 0 : name.hashCode()); result = prime * result + age; return result; } //第三步 @Override public boolean equals(Object obj) { if (this == obj) //判断对象地址是否相等,如果是就不用判断,提高效率 return true; if (obj == null) //对象为空,则不往下走了 return false; if (getClass() != obj.getClass()) //判断两个对象是否一样: return false; TagReqDTO tag = (TagReqDTO) obj; //向下转型 /** 判断成员变量是否一样 */ if (age != tag.age) return false; //判断年龄,int类型,直接比较 //String类型,equals()比较 if (name == null) { if (tag.name != null) return false; } else if (!name.equals(tag.name)) return false; return true; } } /** * 从DB中查询出来的已经存在的标签名 */ List<String> tagListFromDB; /** * 用户请求的标签列表 */ List<TagReqDTO> tagListFromReq; @Before public void init() { // 数据库中存在的标签名列表 tagListFromDB = Lists.newArrayList( "李四", "王五", "赵六"); // 用户提交的 tagListFromReq = Lists.newArrayList( new TagReqDTO("张三", 10), new TagReqDTO("李四", 30), new TagReqDTO("张三", 11)); } @Test public void distinctTag() { TagReqDTO a = new TagReqDTO("1",1); TagReqDTO b = new TagReqDTO("1",11); System.out.println("a===b为"+a.equals(b)); tagListFromReq.stream() .filter(tag->!tagListFromDB.contains(tag.getName())) .distinct() .forEach(tag->System.out.println("添加标签为"+tag)); } }
打印日志:
a===b为false 添加标签为TagReqDTO{name='张三', age=10} 添加标签为TagReqDTO{name='张三', age=11}
诸葛