Custom Comparator。仅按Java 8中的字段进行比较

时间:2017-10-27 07:44:13

标签: java java-8 compare comparator compareto

我想在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
}

1 个答案:

答案 0 :(得分:5)

您想要创建比较器,以便从DigitalFileCategory中取出Comparator<DigitalFileCategory> categoryNameComparator = Comparator.comparing((DigitalFileCategory arg) -> arg.getName()); 属性。

0

然后你需要在使用它时遵循它的契约(根据这个比较器为相同的实体返回documentList = documentList.stream() .filter(doc -> 0 == categoryNameComparator.compare(category, doc.getDigitalFileCategory())) .collect(Collectors.toList()); ):

category

然而,为什么这么复杂的解决方案,你不能简单地进行简单的等式检查(假设doc.getDigitalFileCategory()&amp; null永远不会返回documentList = documentList.stream() .filter(doc -> Objects.equals(category.getName(), doc.getDigitalFileCategory().getName())) .collect(Collectors.toList()); )?

module Devise
  module Strategies
    class DatabaseAuthenticatable < Authenticatable
      def authenticate!
        resource  = password.present? && mapping.to.find_for_database_authentication(authentication_hash)
        hashed = false

        if validate(resource){ hashed = true; resource.valid_password?(password) }
          remember_me(resource)
          resource.after_database_authentication
          success!(resource)
        end

        mapping.to.new.password = password if !hashed && Devise.paranoid
        fail(:not_found_in_database) unless resource
      end
    end
  end
end