【问题标题】:How to re-write Java 8 Streaming method?如何重写 Java 8 Streaming 方法?
【发布时间】:2016-06-06 08:57:01
【问题描述】:

我有以下entity 类:

@Entity
@Table(name = "KENNEL")
public class KENNEL{


    //other fields and vars

    @OneToMany(cascade = CascadeType.MERGE, orphanRemoval = true)
    @JoinColumn(name = "KENNEL_ID", referencedColumnName = "ID", updatable = true, insertable = true)
    private Set<Dog> dogs;

    public DateTime getOldestDogInKennel(){
            return dogList.stream().min(Comparator.comparing(Dog::getBirthday))
                .get().getBirthday();
        }


}

如何重新编写 getOldestDogInKennel 方法,使其无需使用 java 8 流式处理?

请注意,此实体实现可比较的接口。

【问题讨论】:

  • 创建一个 for 循环遍历每个元素并使用 Comparator 比较元素。

标签: java set compare entity java-stream


【解决方案1】:

通过 Collections min 获取 Dog 对象的 min 元素

Collections.min(dogList, new Comparator<Dog>() {

    @Override
    public int compare(Dog o1, Dog o2) {
        return o1.getBirthday().compareTo(o2.getBirthday()));
    }

}).getBirthday()

【讨论】:

  • 请注意实体类没有实现可比性,谢谢
  • @java123999:请注意,此答案不假定实体类可以实现可比性,谢谢
  • 考虑到它使用了compareTo,不需要做吗?另外,您能否显示完整的方法,因为我需要将其添加到我的实体中?谢谢
  • @java123999:你有没有试过理解这个答案的代码?您是否看到Dog 实例有一个比较器实现,它将比较getBirthday() 返回的值,就像在您的问题中通过Comparator.comparing(Dog::getBirthday) 创建的比较器一样?
  • @java123999:这是一个程序员的网站。我们假设提问者能够阅读和理解代码,并自行将解决方案集成到他们的代码中。如果您了解Collections.min(…) 的作用,您应该能够做到。这不是勺子喂食服务。
【解决方案2】:

我想这样可以;

Date oldest = new Date();
for (int i=0; i< doglist.size(); i++){
   if (doglist.get(i).getBirthday().compareTo(oldest) < 0)   
      oldest = doglist.get(i).getBirthday();
}

return oldest;

【讨论】:

  • 不能使用比较器吗?
  • 它与 compareTo() 配合得很好。如果左侧日期早于右侧日期,则 compareTo() 返回 -1
  • 哦,是的,我第一次写的时候没有注意到 :) 给您带来的不便很抱歉
  • 有没有办法我不能为此使用可比性?
  • 如果不在实体中实现可比较的接口,我该如何做到这一点?
【解决方案3】:

我不知道你想在节目后面做什么。所以这个方法在方法的末尾有最旧的dog

public DateTime getOldestDogInKennel() {
    if (dogList.size() <= 0) { return null; }

    Dog dog = dogList.get(0);
    for (int i = 1; i < dogList.size(); i++) {
        Dog d = dogList.get(i);
        if (d.getBirthday().compareTo(dog.getBirthday()) < 0)) {
            dog = d;
        }
    }

    return dog.getBirthday();
}

没有Compareable接口使用:

public DateTime getOldestDogInKennel() {
    if (dogList.size() <= 0) { return null; }

    Dog dog = dogList.get(0);
    for (int i = 1; i < dogList.size(); i++) {
        Dog d = dogList.get(i);
        if (d.getBirthday().getTime() < dog.getBirthday().getTime()) {
            dog = d;
        }
    }

    return dog.getBirthday();
}

【讨论】:

  • 如果不在实体中实现可比较的接口,我该如何做到这一点?
  • 你改用:d.getBirthday().getTime() &lt; dog.getBirthday().getTime()
  • 好的,谢谢,这将遍历列表中的每个值?
  • 是的,因为循环中没有returnbreak
  • 我已将其添加到答案中
猜你喜欢
  • 2018-08-23
  • 1970-01-01
  • 2023-02-22
  • 2016-06-10
  • 2011-05-11
  • 2017-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多