将Java Comparator逻辑移出实体?

时间:2016-05-31 13:57:00

标签: java dictionary java-stream comparator

我目前有一个java EntitiesCatKitten

以下是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>>();

1 个答案:

答案 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);