【问题标题】:Get List<String> while concat 3 Streams from lists of different objects从不同对象的列表中获取 List<String> 而 concat 3 Streams
【发布时间】:2019-04-29 19:38:19
【问题描述】:

我有课

class Person {  
    public List<BaseballPlayer> baseballPlayers;    
    public List<MmaFighter> mmaFighters;    
    public List<RugbyPlayer> rugbyPlayers;  
}

在每个对象播放器中,他的 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);

现在我正在尝试通过使用 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)); 

但我不知道我应该对来自 3 个流的新流类型使用泛型吗?还尝试为所有 3 个类创建父类以在流 diamand 而不是 Object 中使用。此 personStream 存在疑问。

【问题讨论】:

  • 是否BaseballPlayerMmaFighterRugbyPlayer 都实现了定义抽象getId() 方法的通用接口?
  • @JacobG。他们没有
  • 是否允许修改这些类以实现通用接口?
  • 如果这是一个解决方案并且没有其他方法可以修改类,但如果有其他方法我会尝试它

标签: java spring collections java-stream


【解决方案1】:

试试这个。

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

或者

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

【讨论】:

  • 你也可以用Function.identity()代替s -&gt; s
【解决方案2】:

如果你在所有类中实现一个通用接口:

interface Team {
    String getId();
}

您可以使用以下代码:

List<BaseballPlayer> baseballPlayers = ...;
List<MmaFighter> mmaFighters = ...;
List<RugbyPlayer> rugbyPlayers = ...;

List<String> identfiers = Stream.of(baseballPlayers, mmaFighters, rugbyPlayers)
        .flatMap(Collection::stream)
        .map(Team::getId)
        .collect(Collectors.toList());

【讨论】:

  • 这就像问题本身的第一个问题,OP 说 - 这不是一个选项
  • 看看他们最后的评论:'但如果有其他方法我会尝试'。
  • 确实,错过了
猜你喜欢
  • 2021-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-07
  • 1970-01-01
  • 2011-06-26
  • 2017-09-29
  • 1970-01-01
相关资源
最近更新 更多