Подсчитать количество вложенных элементов, используя поток API java - PullRequest
4 голосов
/ 09 апреля 2020

Подсчет количества контента с использованием потока

class Subject {
  private String id;
  private String name;
  private List<Unit> units;
}

class Unit {
  private String id;
  private String name;
  private List<Topic> topics;
}

class Topic {
  private String id;
  private String name;
  private List<Content> contents;
}

class Content {
  private String id;
  private String contentType;
  private SubTopic subtopic;
}

При Java 8 и Streams я хочу, чтобы количество элементов Content, которое имеет тип contentType, равное видео.

Для подсчета topi c Я пробовал это:

int topicCount = subject.getUnits().stream()
    .map(Unit::getTopics)
    .filter(topics -> topics != null)
    .mapToInt(List::size)
    .sum();

Ответы [ 2 ]

4 голосов
/ 09 апреля 2020

Вы можете плоско отобразить вложенные элементы и сосчитать их:

long videoContentCount = 
    subject.getUnits()
           .stream()
           .flatMap(u -> u.getTopics().stream())
           .flatMap(t -> t.getContents().stream())
           .filter(c -> c.getCountetType().equals("video"))
           .count();
3 голосов
/ 09 апреля 2020

Вы используете потоки, как показано ниже,

subject.getUnits()
        .stream()
        .map(Unit::getTopics)
        .flatMap(List::stream)
        .map(Topic::getContents)
        .flatMap(List::stream)
        .map(Content::getContentType)
        .filter("video"::equals)
        .count();

Вы можете избежать карты,

subject.getUnits()
        .stream()
        .flatMap(e->e.getTopics().stream())
        .flatMap(e->e.getContents().stream())
        .map(Content::getContentType)
        .filter("video"::equals)
        .count();
...