【问题标题】:Get the largest attribute value in a Collection of Objects in Java获取Java中对象集合中的最大属性值
【发布时间】:2016-04-07 00:27:23
【问题描述】:

我有一个包含 Id 的对象 Patch,所以假设它有:

public class Patch {
    private Long id;

    public Patch(Long id) {
        this.id = id;
    }

    public Long getId() {
        return id;
    }
}

假设我有一个大小 > 0 的补丁的集合。所以该集合可以包含 1 个补丁对象或 10 个补丁对象。我想获取补丁中最大的 id 值。

换句话说,如果我有 3 个带有 Id 的 Patch 对象:

patch1.getId() = 1;
patch3.getId() = 3;
patch2.getId() = 2;

那么我想返回的数字是 3。此时,集合没有顺序。但是,每个新的补丁总是有一个比前一个大 1 的 Id,从 1 开始。换句话说,如果我添加另一个具有上述内容的补丁,则 id 将保证为 4。如果我有 10 个 Patch 对象, 最大的 Id 保证为 10。

我相信这样的事情会起作用,但当只有 1 个补丁存在时可能会导致问题:

Collections.max(patches, (p1, p2) -> Long.compare(p1.getId(), p2.getId())).getId();

patches.stream().max((p1, p2) -> Long.compare(p1.getId(), p2.getId())).get().getId();

但是这两个似乎......过度......有没有更好的方法来做到这一点?

此外,这样做的目的是避免强制转换为 long。从技术上讲,以下方法有效,但不赞成:

(long) patches.size()

当然,这似乎非常方便......

【问题讨论】:

  • 假设非空值,只需使用Collections.max(patches, Comparator.comparing(Patch::getId)).getId();
  • @Pillar comparingLong(),甚至

标签: java collections max


【解决方案1】:

你想要的是id,而不是Patch,所以你应该通过id找到最大的id,而不是最大的Patch

long a = patches.stream().mapToLong(Patch::getId).max().orElse(-1);

【讨论】:

  • .max().getAsLong() :p .max() 返回OptionalLong
  • @fge .getAsLong() :p
  • 我选择了orElse。当我使用get()getAsLong() 时,人们会投票。
  • 太棒了,谢谢!需要注意的是,如果走 get() 路线,我认为你必须使用 getAsLong()?
  • 是的,对不起。当我说get时,我的意思是Optional.get()
猜你喜欢
  • 1970-01-01
  • 2017-06-29
  • 1970-01-01
  • 2012-06-23
  • 2014-01-22
  • 2018-07-09
  • 1970-01-01
  • 2017-09-20
  • 1970-01-01
相关资源
最近更新 更多