【问题标题】:Stream distinct() with repeated objects带有重复对象的流 distinct()
【发布时间】:2019-04-02 17:29:30
【问题描述】:

我有一个基本的 SpringBoot 2.0.6.RELEASE 应用程序。使用 Spring Initializer、JPA、嵌入式 Tomcat、Thymeleaf 模板引擎,并将其打包为具有 restful 架构的可执行 JAR 我有这个对象:

public class Menu  implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @JsonIgnore
    private Long id;

     @Override
        public int hashCode() {
            return (int) (id ^ (id >>> 32));
        }



    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Menu menu = (Menu) o;

        return id == menu.id;
    }
...
}

我在控制器中也有这段代码:

List<Menu> favoriteMenus = new ArrayList<Menu>();

        favoriteMenus.addAll(user.getFavoriteMenus());
        favoriteMenus.addAll(applicationProfileService
                .menusByProfile(user.getApplicationSetup().getApplicationProfile().getProfileKey()));

        favoriteMenus = 
                favoriteMenus
                    .stream()
                    .distinct()
                    .collect(Collectors.toList());

尽管distinct() 列表中有重复的菜单

【问题讨论】:

    标签: java list java-stream collectors


    【解决方案1】:

    您正在测试 id 的引用相等性,而不是其值相等性(更多信息,例如 here),而 idLong

    Long 类将原始类型 long 的值包装在一个对象中。

    id == menu.id 更改为id.equals(menu.id),它应该可以工作(前提是这里没有其他错误)。

    【讨论】:

    • …或将字段类型更改为long
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    相关资源
    最近更新 更多