2017-10-04 6 views
3

私はTestというクラスを持っています。このクラスには、int値を返すgetNumberというメソッドがあります。Mapのストリームを使用して最大値を取得

public class Test{ 
    . 
    . 
    . 
    . 
    public int getNumber(){ 
      return number; 
    } 
} 

また、キーがLongで値がTestオブジェクトであるHashMapがあります。

Map<Long, Test> map = new HashMap<Long, Test>(); 

ストリームラインコードを使用してキーを印刷し、最大getNumberを持つgetNumberも印刷したいとします。

私の質問は、私は最大量のキーを返すことができる方法であるしかし、私はライン

以下
final Comparator<Test> comp = (p1, p2) -> Integer.compare(p1.getNumber(), p2.getNumber()); 

map.entrySet().stream().map(m -> m.getValue()) 
    .max(comp).ifPresent(d -> System.out.println(d.getNumber())); 

を経由して最大数を印刷することができますか?ストリームを使って1ラウンドでやってもいいですか?

答えて

1

私が正しくあなたを理解している場合:

Entry<Long, Test> entry = map.entrySet() 
      .stream() 
      .max(Map.Entry.comparingByValue(Comparator.comparingInt(Test::getNumber))) 
      .get(); 
+0

それは魅力のように機能します。ありがとうございました –

+1

高価な '.sorted(...).findFirst()'に変える理由はありません。 OPのコードのように 'max'を使用することができますが、唯一の方法は' map'ステップを実行しないことです: 'map.entrySet().stream().max(Map.Entry.comparingByValue(Comparator.comparingInt(Test :: getNumber)))).get() ' – Holger

+0

@Holgerもう一度、間違って編集しました – Eugene

1

を使用すると、テストの場合で最大「数」の値に対応するキーと値のペアを見つけたい場合は、比較するコンパレータと組み合わせCollections.max()を使用することができますこの基準のエントリ。

import static java.util.Comparator.comparingInt; 

... 

Map.Entry<Long, Test> maxEntry = 
    Collections.max(map.entrySet(), comparingInt(e -> e.getValue().getNumber())) 

あなたは、ストリームの方法を使用したい場合は(あなたが値に関連付けられたキーを失ったため)、その後、マッピングを削除し、同じコンパレータを提供します。

map.entrySet() 
    .stream() 
    .max(comparingInt(e -> e.getValue().getNumber())) 
    .ifPresent(System.out::println); 

注意があること両方のスニペットに小さな差があります。最初のスニペットは、指定されたマップが空の場合はNoSuchElementExceptionです。

関連する問題