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()));
});
答案 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());
});