自定义 Comparator.comparing 仅按 Java 中的字段 8

Custom Comparator.comparing only by field in Java 8

我想在 Java 8 中使用 Comparator.comparing(....) 实现一个比较器来仅按字段进行比较。

我想实现的功能如下:

List<DocumentLink> documentList = documentLinkService.getDocumentList(baseInstance);
        //call of custom comparator for DigitalFileCategory due to compare only by Name
        documentList = documentList.stream()
                .filter(doc -> category.comp(doc.getDigitalFileCategory()))
                .collect(Collectors.toList());

所以我需要一个布尔返回值。 DigitalFileCategory 中的 Comp 方法:

public boolean comp(Object obj) {
    return super.equals(obj) ||
            (obj != null &&
                    getName() != null &&
                    getName().equals(((DigitalFileCategory) obj).getName()));
}

任何想法,我该怎么做? 当我尝试实现 Comparator.comparing 时,要求我将 getName 设为静态。

DigitalFileCategory.class

public class DigitalFileCategory extends _Base {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "iddigitalfilecategory", nullable = false)
    private Integer iddigitalfilecategory;

    @Column(name = "Name", length = 64)
    private String name;

    @Column(name = "Priority")
    private Integer priority;
    //    getter && setter
}

您想创建比较器以从 DigitalFileCategory.

中取出 name 属性
Comparator<DigitalFileCategory> categoryNameComparator =
    Comparator.comparing((DigitalFileCategory arg) -> arg.getName());

然后你需要在使用它时遵守它的合同(0 根据这个比较器,return 为平等的实体编辑):

documentList = documentList.stream()
              .filter(doc -> 0 == categoryNameComparator.compare(category, doc.getDigitalFileCategory()))
              .collect(Collectors.toList());

然而,为什么这么复杂的解决方案,你不能简单地做简单的相等检查(假设 category & doc.getDigitalFileCategory() 从不 return null)?

documentList = documentList.stream()
              .filter(doc -> Objects.equals(category.getName(), doc.getDigitalFileCategory().getName()))
              .collect(Collectors.toList());