我现在有一个java Entities
:Cat
和Kitten
下面是包含当前comparator
逻辑的猫实体,该实体命令猫拥有最古老的猫的猫实体
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>>();
发布于 2016-06-01 10:18:04
请注意,您的代码包含几个不必要的重复。在……里面
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
元素流,您可以自然地进行比较,而不必在每个比较中重新获取属性。A结果已经是最小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);
https://stackoverflow.com/questions/37547783
复制相似问题