Фильтр необязательныйв java8 - PullRequest
1 голос
/ 21 марта 2019

Я пытаюсь отфильтровать Optional<List<Object>> в Java8.В приведенном ниже примере я пытаюсь отфильтровать список, не собирая полный список (игроки).Это возможно?

public List<Player> getPlayers(int age, Team team) {
    Optional.ofNullable(team).map(Team::getPlayers); 
    // needs to filter players older than 20 years, without collecting it as a list.
}

class Team {

    String name;
    List<Player> players;
    public String getName() {
        return name;
    }

    public void setName(final String name) {
        this.name = name;
    }

    public List<Player> getPlayers() {
        return players;
    }

    public void setPlayers(final List<Player> players) {
        this.players = players;
    }

}


class Player {

    String playerName;
    String age;

    public String getPlayerName() {
        return playerName;
    }

    public void setPlayerName(final String playerName) {
        this.playerName = playerName;
    }

    public String getAge() {
        return age;
    }

    public void setAge(final String age) {
        this.age = age;
    }
}

Ответы [ 2 ]

4 голосов
/ 21 марта 2019

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

Если вы сделаете это, вы можете просто позвонить stream() напрямую, без участия в этом Optional бизнесе:

team.getPlayers().stream()
    .filter(p -> p.getAge() > 20)
2 голосов
/ 21 марта 2019

С обновленной сигнатурой метода вы, похоже, ищете:

public List<Player> getPlayers(Team team, int age) {
    return Optional.ofNullable(team).map(Team::getPlayers)
            .orElse(Collections.emptyList())
            .stream()
            .filter(a -> Integer.parseInt(a.getAge()) > 20)
            .collect(Collectors.toList());
}
...