我目前有一个java Entities
:Cat
和Kitten
以下是Cat实体,其中包含当前comparator
逻辑,用于订购Cat实体,其中cat具有最早的Kitten
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
界面。我可以在我的应用程序中调用比较器吗?
即。如果我想要ordered Map
只猫和它们的小猫列表,那么最老的小猫的猫是地图中的第一个条目:
Map<Cat, List<Kitten>> mapOfCatsAndKittens = new HashMap<Cat, List<Kitten>>();
答案 0 :(得分: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
s的列表进行排序:
List<Cat> list= … ; // should be a mutable list implementation, e.g. ArrayList
// perhaps add (some more) Cats
list.sort(oldestKitten);