2016-04-06 5 views
1

内のオブジェクトのコレクションで最大の属性値を取得します。したがって、Collectionには1つのPatchオブジェクトまたは10つのPatchオブジェクトを含めることができます。私は、パッチの中で最大のid値を取得したい。言い換えれば私はIDが含まれたオブジェクトのパッチを持っているので、のは、持っていることを言わせたJava

、私はIDを持つ3つのパッチオブジェクトがあった場合:

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

をその後、私は返すしたい番号はこの時点では3になり、コレクションへの順序はありません。ただし、新しいパッチのIDは常に1になります。つまり、上記で別のパッチを追加した場合、IDは4になることが保証されます。10個のパッチオブジェクトがある場合、最大の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) patches.size() 

それはしかし...

+0

null以外の値を仮定して、 'Collections.max(patches、Comparator.comparing(Patch :: getId))。getId();'を使用してください。 – Savior

+0

@Pillar 'comparisonLong()'、さらに – fge

答えて

3

とても便利であるように確かにあなたはid、ないPatchをしたいと思われるので、あなたは最大idを見つける必要があります、idによって最大Patchではありません。

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

'.max()。getAsLong()':p '.max()'は 'OptionalLong'を返す – fge

+0

@fgeありがとう、私は編集します。 –

+0

@fge .getAsLong():p –