Some piece of code:
public class Player {
Team team;
String name;
}
public class Team {
List<Player> players;
}
public class Demo {
@Inject
TeamDAO teamDAO;
@Inject
PlayerDAO playerDAO;
List<String> findTeamMatesNames(String playerName) {
Optional<Player> player = Optional.ofNullable(playerDAO.get(playerName));
return player.flatMap(p -> teamDAO.findPlayers(p.team))
.map(p -> p.name)
.orElse(Collections.emptyList());
}
}
Why am I not able to do this? In flatMap method I am getting error "Type mismatch: cannot convert from List to Optional"
My goal is:
If optional is present I want to get list of items based on this optional object property
If optional is not present I want to return empty list
You can use map
to perform the desired operation. The map
operation will not take place if the Optional
is empty but leave again an empty Optional
. You can provide the fallback value afterwards:
player.map(p -> teamDAO.findPlayers(p.team)).orElse(Collections.emptyList())
The mapping from a List
of Player
to a List
of Player’s name String
s can’t be performed by an Optional
; that’s a Stream
task:
Optional<Player> player = Optional.ofNullable(playerDAO.get(playerName));
return player.map(p -> teamDAO.findPlayers(p.team)
.stream().map(tp -> tp.name).collect(Collectors.toList()))
.orElse(Collections.emptyList());