2017-10-27 11 views
0

Java 8에서 Comparator를 구현하여 Comparator.comparing (....)을 사용하여 필드별로 비교합니다. 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에서 경화제 방법 : 나는 그렇게 할 수있는 방법을

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 
} 
+0

'DocumentLink' 및'DigitalFileFactory' 클래스에 대한 기본 정보를 제공해주십시오. –

+3

왜 Comparator가 필요합니까? – Oleg

+1

'Comparator'는 정렬을위한 것이지 평등을위한 것이 아닙니다. – shmosel

답변

3

당신은 당신이 DigitalFileCategory 밖으로 name 속성을 가지고 비교기 만들려고합니다.

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()null으로 반환하지 않는다고 가정)?

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

답장을 보내 주셔서 감사하지만 문제는 이름으로 만 비교해야한다는 것입니다. – pik4

+1

@pkont 알 수 있습니다. 'Object.equals' 제안을 개정했습니다. 'doc.getDFC()'와'category'는 결코 null이 아닌 것으로 가정합니다. –