【发布时间】:2019-02-08 14:13:36
【问题描述】:
假设我有一群恶棍。它们的特点是它们的好、坏或丑。
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> 只有一个成员:Andy。他真的是最好的,最坏的,最丑的!
但是,我有很多代码重复、收集值、再次将它们转换为流等。关于如何清理这些有什么建议吗?
JVM 是如何处理的。依次或在引擎盖下发生了什么魔法?
【问题讨论】:
-
如果 Eddy 有
"Eddy", 3, 1, 2,会怎样,你会怎么回答?Andy或Eddy? -
在这种情况下,应该是 Eddy。所以这个想法是,它首先查看
good的值最高,然后(在平局的情况下)bad的值最高,然后(如果它仍然不是决定性的)具有最高的“丑陋”的价值。我更新了我的帖子以明确这一点。
标签: java java-stream dry