Как вернуть значение в конце итерации по списку, используя лямбду, Java - PullRequest
0 голосов
/ 12 июня 2018

Попытка перебрать список Объектов, чтобы получить значение последнего параметра из итерации.

long lastSeen = 0L;
for(Object o : list) {
    lastSeen = o.getLastSeenId();
}
// will make use of the lastSeen.

Я не могу сделать то же самое с лямбда,

long lastSeen = 0L;
list.stream().forEach(o-> {
    lastSeen = o.getLastSeenId();
});

какЯ закончу с этим время компиляции.

Локальная переменная lastSeenId, определенная во вложенной области видимости, должна быть конечной или фактически конечной

Я мог бы сделать это, чтобы прочитать наибольшее, но не хочу:

Set<Long> set = new HashSet<>();
list.stream().forEach(o-> {
    set.add(mergeUser.getLastSeenId());
});

Есть ли лучший способ?Причина этого заключается в том, чтобы отслеживать последний обработанный цикл обработки значений (если произошла исключительная ситуация, чтобы завершиться).

Ответы [ 4 ]

0 голосов
/ 14 июня 2018

Прежде всего, я бы не стал повторять список для извлечения последнего элемента.

Если в этом случае, если вы хотите выполнить потоковую передачу и получить последний элемент, у "one.util.StreamEx" есть лучший способ сделать это:

StreamEx.of(list)
            .collect(MoreCollectors.last())
            .get();
0 голосов
/ 12 июня 2018

Я не вижу причин, по которым вам нужно перебирать весь исходный код, чтобы просто получить последний идентификатор.Это может быть выполнено без итерации:

long lastSeen = list.size() > 0? list.get(list.size()-1).getLastSeenId() : 0L;

Однако, если вы планируете делать какие-то другие вещи в каждой итерации, а не только вышеупомянутые, я бы придерживался вашего текущего императивного подхода.Попытка использовать потоки здесь не подходит и ничего не дает.

0 голосов
/ 14 июня 2018

Если вы хотите продолжать использовать Stream, вы можете использовать AtomicLong для хранения lastSeenValue .

final AtomicLong lastSeen = new AtomicLong(0);
list.stream().forEach(o-> {
    lastSeen.set(o.getLastSeenId());
});
0 голосов
/ 12 июня 2018

Первый reduce набор элементов для получения последнего элемента из Stream.Затем используйте map, чтобы получить желаемое значение из последнего элемента после сокращения.

final long lastSeenValue = objects.stream()
    .reduce((first, second) -> second)
    .map(LastSeen::getLastSeenId)
    .orElse(null);

Однако, на мой взгляд, потоки могут быть не лучшим выбором для постановки задачи.В этом случае не стесняйтесь вернуться к императивному подходу.

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