首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将Java比较器逻辑移出实体?

将Java比较器逻辑移出实体?
EN

Stack Overflow用户
提问于 2016-05-31 13:56:59
回答 1查看 121关注 0票数 0

我现在有一个java EntitiesCatKitten

下面是包含当前comparator逻辑的猫实体,该实体命令猫拥有最古老的猫的猫实体

代码语言:javascript
运行
复制
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和它们的小猫的列表,而最老的猫是地图上的第一个条目:

代码语言:javascript
运行
复制
Map<Cat, List<Kitten>> mapOfCatsAndKittens = new HashMap<Cat, List<Kitten>>();
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-01 10:18:04

请注意,您的代码包含几个不必要的重复。在……里面

代码语言:javascript
运行
复制
public DateTime getOldestBornValueForKittenInList() {
    return kittenList.stream().min(Comparator.comparing(Kitten::getBorn)).get().getBorn();
}

您可以让比较器获取属性getBorn,尽管这是您感兴趣的唯一属性。这样您就可以将操作简化为

代码语言:javascript
运行
复制
public DateTime getOldestBornValueForKittenInList() {
    return kittenList.stream().map(Kitten::getBorn).min(Comparator.naturalOrder()).get();
}

通过首先映射到属性,您可以得到一个DateTime元素流,您可以自然地进行比较,而不必在每个比较中重新获取属性。A结果已经是最小DateTime

请记住,在这两种情况下,如果列表为空,则操作将失败。

Comparator.comparing工厂仍有自己的位置。当您想要通过属性比较Cat对象时,就可以这样做:

代码语言:javascript
运行
复制
Comparator<Cat> oldestKitten=Comparator.comparing(Cat::getOldestBornValueForKittenInList);

您可以使用这样的比较器创建按该属性排序的映射。

代码语言:javascript
运行
复制
Map<Cat, List<Kitten>> mapOfCatsAndKittens = new TreeMap<>(oldestKitten);

或者对Cat的列表进行排序:

代码语言:javascript
运行
复制
List<Cat> list= … ; // should be a mutable list implementation, e.g. ArrayList
// perhaps add (some more) Cats
list.sort(oldestKitten);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37547783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档