给定一个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));
}
我希望有一个更简洁的版本,可能使用流(或只是用不同的方式编写)。您有什么建议?
最佳答案
这是流媒体版本
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()));
flatMap
部分将所有Riders展平为AbstractMap.SimpleEntry
,每个都包含一个Rider
及其所属的Unicorn
。然后,我们通过比较两个Rider
的rideTime
获得最大条目。如果存在,我们创建ImmutablePair结果,否则将为Optional.empty
关于java - 如何使用流重写嵌套列表的查找功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53524333/