Скажи, у меня есть группа злодеев.Они характеризуются тем, насколько они хороши, плохи или уродливы.
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>
только с одним членом: Энди.Он действительно лучший, худший и уродливый!
Однако у меня довольно много повторений кода, сбор значений, повторное их превращение в потоки и т. Д. Какие-нибудь предложения о том, как это очистить?
Как это обрабатывается JVM.Последовательно или какая-то магия происходит под капотом?