在concat 3从不同对象的列表流传输时获取List <String>

Geo*_*hev 2 java collections spring java-stream

我有一堂课

class Person {  
    public List<BaseballPlayer> baseballPlayers;    
    public List<MmaFighter> mmaFighters;    
    public List<RugbyPlayer> rugbyPlayers;  
}
Run Code Online (Sandbox Code Playgroud)

在每个对象播放器中,其id都有String属性。我正在尝试收集列表中的所有ID

List<String> baseballPlayersIds = person.baseballPlayers.stream()
.map(s -> s.getId()).collect(Collectors.toList());  

List<String> mmaFightersIds = person.mmaFighters.stream()
.map(s -> s.getId()).collect(Collectors.toList());  

List<String> rugbyPlayersIds = person.rugbyPlayers.stream()
.map(s -> s.getId()).collect(Collectors.toList());

baseballPlayersIds.addAll(mmaFightersIds);
baseballPlayersIds.addAll(rugbyPlayersIds);
Run Code Online (Sandbox Code Playgroud)

现在,我试图通过使用Stream.concat()简化事情并改善逻辑

Stream<List<BaseballPlayer>> baseballPlayersIdsStream =  Stream.of(person.baseballPlayers);    
Stream<List<MmaFighter>> mmaFightersIdsStream = Stream.of(person.mmaFighters);
Stream<List<RugbyPlayer>> rugbyPlayersIdsStream = Stream.of(person.rugbyPlayers);       

Stream<List<? extends Object>> personStream = Stream.concat(baseballPlayersIdsStream, Stream.concat(mmaFightersIdsStream, rugbyPlayersIdsStream)); 
Run Code Online (Sandbox Code Playgroud)

但我无法确定是否应该对这3个流中出现的新流类型使用泛型?还尝试为所有3个类创建父类,以在流diamand中代替Object使用。这个personStream有疑问。

sak*_*029 6

尝试这个。

List<String> allIds = Stream.of(
    person.baseballPlayers.stream().map(p -> p.getId()),
    person.mmaFighters.stream().map(p -> p.getId()),
    person.rugbyPlayers.stream().map(p -> p.getId()))
    .flatMap(s -> s)
    .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

要么

List<String> allIds = Stream.of(
    person.baseballPlayers.stream().map(BaseballPlayer::getId),
    person.mmaFighters.stream().map(MmaFighter::getId),
    person.rugbyPlayers.stream().map(RugbyPlayer::getId))
    .flatMap(Function.identity())
    .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

  • 您也可以使用Function.identity()代替s-&gt; s (2认同)