ストリームを使用して、複数の属性の最大値を持つオブジェクトを取得するには?

MWB:

私は悪役の束を持っていると言います。彼らは、彼らはどのように良い、悪いか、醜いことを特徴とします。

static class Villain {
    String name;
    int good;
    int bad;
    int ugly;

    Villain(String name, int good, int bad, int ugly) {
        this.name = name;
        this.good = good;
        this.bad = bad;
        this.ugly = ugly;
    }
}

さて、ギャングを満たしています。

List<Villain> villains = new ArrayList<>();
villains.add(new Villain("Bob", 2, 2, 1));
villains.add(new Villain("Charley", 2, 1, 2));
villains.add(new Villain("Dave", 2, 1, 1));
villains.add(new Villain("Andy", 2, 2, 2));
villains.add(new Villain("Eddy", 1, 2, 2));
villains.add(new Villain("Franz", 1, 2, 1));
villains.add(new Villain("Guy", 1, 1, 2));
villains.add(new Villain("Harry", 1, 1, 1));

私は何をしたい、私は最高のが誰であるかを把握したい、最悪と醜いです。そのことを私は最高のが誰であるかを把握することを意味します。同点の場合は、最悪の人です。同点の場合は、最も醜い人です。

私は以下のコードで、そうすることに成功しました。

List<Villain> bestVillains = villains
        .stream()
        .collect(groupingBy(v -> v.good, TreeMap::new, toList()))
        .lastEntry()
        .getValue()
        .stream()
        .collect(groupingBy(v -> v.bad, TreeMap::new, toList()))
        .lastEntry()
        .getValue()
        .stream()
        .collect(groupingBy(v -> v.ugly, TreeMap::new, toList()))
        .lastEntry()
        .getValue();

これは、確かに、につながるList<Villain>アンディ:唯一のメンバーと。彼は本当に、最高の最悪かつ最も醜いです!

しかし、私は、任意の提案どのようにTEクリーンアップこの上など、再びストリームにそれらを回して、値を収集し、コードの繰り返しのかなりのビットを持っていますか?

これはどのようにJVMによって処理されています。順次またはフードの下で起こっていくつかの魔法はありますか?

また:

アイデアは(それはまだ決定的ではない場合)「醜いの最高値を有し、その後、悪いの最高値を有している(タイの場合は)良いの最高値となることはまずルックス、そして、ということですので、 "

あなたはむしろ、次を使用してソートを探しているComparatorためVillian秒:

Comparator<Villain> villainComparator = Comparator.comparingInt(Villain::getGood)
    .thenComparingInt(Villain::getBad)
    .thenComparingInt(Villain::getUgly);

Villain result = villains.stream()
                         .max(villainComparator)
                         .orElse(null);

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=196799&siteId=1