Java 8 stream optimization for nested level

时间:2018-12-19 11:13:51

标签: java java-8 java-stream

How can we use optimize this stream to collect nested level and root level for a set.

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

4 个答案:

答案 0 :(得分:8)

Don't use forEach to add elements to a collection.

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

Or just use a plain old (enhanced) for loop. Streams don't give you any clear advantage here.

答案 1 :(得分:1)

Well, Stream API and lambdas don't give you any advantage here.

optimize this stream to collect

If I get correctly the meaning of your "optimize" word, then I would go with old-style foreach:

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

If all you have is a hammer, everything looks like a nail.

答案 2 :(得分:0)

You can skip stream creation in groups.stream().forEach() because of Iterable.forEach()

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

Streams are generally more costly than regular iteration due to years of loop optimization put into JIT.

答案 3 :(得分:0)

Or may be even:

    Set<String> groupedUsers = new HashSet<>();
    groups.forEach(x -> {
        groupedUsers.add(x.getTeamLeadId());
        groupedUsers.addAll(x.getTeamMemberIds());
    });