Получить список <String>при одновременном совпадении 3 потоков из списков различных объектов - PullRequest
2 голосов
/ 29 апреля 2019

У меня есть класс

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

В каждом объектном проигрывателе есть свойство String для его идентификатора.Я пытаюсь собрать все идентификаторы в списке, которые я делаю

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 сомневается.

Ответы [ 2 ]

6 голосов
/ 29 апреля 2019

Попробуйте это.

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());
2 голосов
/ 29 апреля 2019

Если вы реализуете общий интерфейс во всех классах:

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