2016-05-31 2 views
0

Я в настоящее время Java Entities: Cat и KittenПеремещение логики Java Comparator из сущности?

Ниже сущность Кошка, которая содержит текущую comparator логику для упорядочивания объектов Cat, по которым кошка имеет самый старый Котик я больше не

public class Cat implements Comparable<Cat> 
{ 

    //other fields and methods 

    @OneToMany(mappedBy = "cat",fetch = FetchType.EAGER) 
    private List<Kitten> kittenList= new ArrayList<Kitten>(); 

    public DateTime getOldestBornValueForKittenInList(){ 

     return kittenList.stream().min(Comparator.comparing(Kitten::getBorn)) 
       .get().getBorn(); 
    } 

    public int compareTo(Cat c) { 

     //fist compare on the oldest Created DateTime Value 
     int i = getOldestBornValueForKittenInList().compareTo(c.getOldestBornValueForKittenInList()); 
     if (i != 0){ 
      return i; 
     } 

    } 

} 

хочу, чтобы моя сущность Cat реализовала интерфейс comparable. Могу ли я вызвать компаратор в моем приложении?

I.e. если бы я хотел в ordered Map кошках и их список котят, с кошкой с самым старым котенком является первой записью в карте:

Map<Cat, List<Kitten>> mapOfCatsAndKittens = new HashMap<Cat, List<Kitten>>(); 
+1

в общем, имея логику в классе сущностей является плохой практикой, есть сервис с объектом autowired применять логику –

+1

Почему не 'TreeMap'? Он предназначен для «компаратора». – Tirath

+0

@RoelStrolenberg вы можете привести пример сервиса, который я мог бы заменить логикой сущности? – java123999

ответ

1

Обратите внимание, что ваш код содержит несколько ненужных повторов. В

public DateTime getOldestBornValueForKittenInList() { 
    return kittenList.stream().min(Comparator.comparing(Kitten::getBorn)).get().getBorn(); 
} 

вы позволяете компаратор выборку свойства getBorn, несмотря на то, что это единственное свойству вас интересуют. Таким образом, вы можете упростить операцию

public DateTime getOldestBornValueForKittenInList() { 
    return kittenList.stream().map(Kitten::getBorn).min(Comparator.naturalOrder()).get(); 
} 

По картографированию свойства первой , вы получаете поток DateTime элементов, которые вы можете естественным образом сравнить, не переучивая свойство при каждом сравнении. Результат - это уже минимум DateTime.

Имейте в виду, что в любом случае операция завершается с ошибкой, если список пуст.

Но фабрика Comparator.comparing по-прежнему имеет свое место. Право, когда вы хотите сравнить Cat объектов по свойству:

Comparator<Cat> oldestKitten=Comparator.comparing(Cat::getOldestBornValueForKittenInList); 

Вы можете использовать такой компаратор, чтобы создать карту, отсортированный по этому свойству

Map<Cat, List<Kitten>> mapOfCatsAndKittens = new TreeMap<>(oldestKitten); 

или отсортировать список Cat с:

List<Cat> list= … ; // should be a mutable list implementation, e.g. ArrayList 
// perhaps add (some more) Cats 
list.sort(oldestKitten); 
+0

спасибо, могу ли я также использовать несколько предложений в компараторе ?, то есть, если бы я хотел сначала проверить на oldestBornValue котенка, а затем проверить другое предложение? Пополнить первые 2 равны? – java123999

+0

'Компаратор.сравнивая (Cat :: firstProperty). thenComparing (Cat :: nextProperty) ' – Holger

+0

Спасибо, поэтому первым ключом в этом Treemap будет кошка с самым старым котенком, второй ключ будет Cat со 2-м старейшим котенком и так далее ? – java123999