Как переписать функцию поиска из вложенных списков с помощью потоков - PullRequest
0 голосов
/ 28 ноября 2018

Учитывая 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));
}

Я надеялся на более лаконичную версию, возможно, с использованием потоков (или просто написанных по-другому).Каковы будут ваши предложения?

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Вот потоковая версия

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 объединяет всех всадников в AbstractMap.SimpleEntry s, каждый из которых содержит Rider и Unicorn, частью которого он был.Затем мы получаем максимальную запись, сравнивая два Rider rideTime.Если присутствует, мы создаем результат ImmutablePair, иначе будет Optional.empty

0 голосов
/ 28 ноября 2018

Может быть, что-то вроде этого, вы можете добавить необходимые проверки нуля ..

// 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 в Rider Я думаю, так что вам не нужноОбыщите своего единорога, как только у вас появится наездник.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...