给出一个List<Unicorn>
,每个独角兽都包含一个List<Rider>
,返回该独角兽和一部分骑手的最新骑手信息。
我这样写:
static Optional<ImmutablePair<Unicorn, Rider>> findLatestExperiencedRiderInfo(
final List<Unicorn> unicorns) {
Rider latestExperiencedRider = null;
Unicorn unicornOfLatestExperiencedRider = null;
long latestRideTime = 0L;
for (final Unicorn unicorn : unicorns) {
for (final Rider rider : unicorn.getRiders()) {
if (rider.getType() == Rider.Type.EXPERIENCED) {
final long time = rider.getRideTime();
if (time > latestRideTime) {
latestRideTime = time;
latestExperiencedRider = rider;
unicornOfLatestExperiencedRider = unicorn;
}
}
}
}
return latestExperiencedRider == null
? Optional.empty()
: Optional.of(new ImmutablePair<>(
unicornOfLatestExperiencedRider,
latestExperiencedRider));
}
我希望有一个更简洁的版本,可能使用流(或者只是用不同的方式编写)。您有什么建议?
答案 0 :(得分:3)
这是流版本
null
unicorns.stream()
.flatMap(unicorn -> unicorn.getRiders()
.stream()
.filter(rider -> rider.getType() == Rider.Type.EXPERIENCED)
.map(rider -> new AbstractMap.SimpleEntry<>(unicorn, rider)))
.max(Comparator.comparingLong(entry -> entry.getValue().getRideTime()))
.map(entry -> new ImmutablePair<>(entry.getKey(), entry.getValue()));
部分将所有Riders展平为flatMap
,每个AbstractMap.SimpleEntry
包含一个Rider
及其所属的Unicorn
。然后,我们通过比较两个Rider
的{{1}}获得最大条目。如果存在,我们将创建ImmutablePair结果,否则将为rideTime
答案 1 :(得分:1)
也许是这样,您可以添加必需的null检查。
{"Hello stack. I need help"|regex_replace:"/^(\w+\s)/":" "}
您还可以在// This is your rider..
final Optional<Rider> aRider = unicorns.stream()
.flatMap(unicorn -> unicorn.getRiders().stream())
.filter(rider -> rider.type == Rider.Type.EXPERIENCED)
.max(Comparator.comparingLong(Rider::getRideTime));
// This is your unicorn..
final Optional<Unicorn> any = unicorns.stream()
.filter(unicorn -> unicorn.getRiders().contains(aRider.get()))
.findAny();
中保留对Unicorn
的引用,因此一旦您有骑手,就无需搜索独角兽。