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}

 

posted on 2020-05-13 06:08  菜鸟乙  阅读(195)  评论(0编辑  收藏  举报