Оптимизация потока Java 8 для вложенного уровня - PullRequest
0 голосов
/ 19 декабря 2018

Как мы можем использовать оптимизацию этого потока для сбора вложенного уровня и корневого уровня для набора.

final Set<String> groupedUsers = new HashSet<>();
groups.stream().forEach(group -> {
    groupedUsers.add(group.getTeamLeadId());
    groupedUsers.addAll(group.getTeamMemberIds().stream().collect(Collectors.toSet()));
});

Ответы [ 4 ]

0 голосов
/ 19 декабря 2018

Ну, Stream API и lambdas не дают вам здесь никакого преимущества.

оптимизируйте этот поток для сбора

Если я правильно понял значениевашего «оптимизировать» слово, тогда я бы пошел в старом стиле foreach:

Set<String> groupedUsers = new HashSet<>();
for (Group g : groups) {
    groupedUsers.add(g.getTeamLeadId());
    groupedUsers.addAll(g.getTeamMemberIds());
}

Если все, что у вас есть, это молоток, все выглядит как гвоздь.

0 голосов
/ 19 декабря 2018

Вы можете пропустить создание потока в groups.stream().forEach() из-за Iterable.forEach()

groups.forEach(group -> {
  ..
});

Потоки, как правило, обходятся дороже, чем обычные итерации из-за многолетней оптимизации цикла, введенной в JIT.

0 голосов
/ 19 декабря 2018

Или может быть даже:

    Set<String> groupedUsers = new HashSet<>();
    groups.forEach(x -> {
        groupedUsers.add(x.getTeamLeadId());
        groupedUsers.addAll(x.getTeamMemberIds());
    });
0 голосов
/ 19 декабря 2018

Не используйте forEach для добавления элементов в коллекцию.

Set<String> groupedUsers = groups.stream()
    .flatMap(g -> Stream.concat(
        Stream.of(g.getTeamLeadId()), g.getTeamMemberIds().stream()))
    .collect(toSet());

Или просто используйте старый (улучшенный) цикл for.Потоки здесь не дают явного преимущества.

...