2014-10-08 47 views
3

一些代碼片段:Java 8可選和flatMap - 出錯了?

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()); 
    } 
} 

爲什麼我沒有能夠做到這一點?在flatMap方法,我得到錯誤「類型不匹配:不能從列表轉換爲可選的」

我的目標是:

  1. 如果可選的是目前我想在此基礎上可選的對象屬性的產品清單

  2. 如果選不存在我要回空列表

+0

你會得到什麼錯誤? – talex 2014-10-08 08:53:15

+0

你會得到什麼錯誤?那麼teamDAO.finPlayers是什麼? – user2504380 2014-10-08 08:53:22

+0

'findTeamMatesNames'中的'team'來自哪裏? – coolcfan 2014-10-08 08:54:22

回答

7

您可以使用map執行所需的操作。如果Optional爲空,則不會發生map操作,但會再次留空Optional。您可以提供事後回退值:

player.map(p -> teamDAO.findPlayers(p.team)).orElse(Collections.emptyList()) 

不能由Optional進行從Player一個List到玩家的姓名String s的List的映射;這是一個Stream任務:

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()); 
+0

我沒有那麼必須在第一個map函數內執行下一個操作。謝謝! – dmydlarz 2014-10-08 12:13:40

+0

*我不知道 – dmydlarz 2014-10-08 13:07:45

+0

@dydydz:之後也可以這樣做,例如: 'player.map(p - > teamDAO.findPlayers(p.team))。orElse(Collections.emptyList()) .stream()。map(tp - > tp.name).collect(Collectors.toList()) '具有相同的語義,但它意味着在空的'Optional'情況下在空流上執行不必要的收集操作。 – Holger 2014-10-08 13:14:59