Java 8 findAny i co dalej?

0

Hej,

Pytanie z zakresu podstawowego, ale nie mogę sobie poradzić.

Mam listę i wyszukuję jeden element po warunku:

List<Person> persons ....

persons.stream().filter(p-> p.id == givenId).findAny();

Chciałbym ten element użyć do dalszych obliczeń. Tzn. mam metodę:

int calculate(Person person)

Najchętniej bym to ją wywołał tak:

persons.stream().filter(p-> p.id == givenId).findAny().ifPresent(p2 -> calculate(p2));

Tylko nie wiem gdzie zapisać rezultat zwracany z calculate. Chciałbym, żeby był zapisany w zmiennej lokalnej, ale tak się nie da.

Alternatywą jest wywołanie:

Optional<Person> p = persons.stream().filter(p-> p.id==givenId).findAny();
if (p.isPresent()) {
    local = calculate(p.get());
}

Ale tego drugiego rozwiązania chcę uniknąć. Wydaje się być mało zgrabne i niczym nie różni się od null checka.

0

Nie da sie zapisać po zmienne lokalne musza być effective final w anonimowych klasach/międzymordziach. Nie możesz użyć orElse jako że findAny() zwraca Optionala?

2

Javy 8 nie używałem, ale coś takiego nie pyknie?

persons.stream().filter(p-> p.id == givenId).findAny().map(p2 -> calculate(p2)).orElse(cośtam);

Poza tym widać, że nie używasz parallelStream, więc zamiast filter + findAny wystarczyłoby findFirst.
edit: Mała pomyłka, find nie działa tak jak w Scali :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1