用于嵌套级别的Java 8流优化

用于嵌套级别的Java 8流优化,java,java-8,java-stream,Java,Java 8,Java Stream,我们如何使用optimize这个流来收集集合的嵌套级别和根级别 final Set<String> groupedUsers = new HashSet<>(); groups.stream().forEach(group -> { groupedUsers.add(group.getTeamLeadId()); groupedUsers.addAll(group.getTeamMemberIds().stream().collect(Collect

我们如何使用optimize这个流来收集集合的嵌套级别和根级别

final Set<String> groupedUsers = new HashSet<>();
groups.stream().forEach(group -> {
    groupedUsers.add(group.getTeamLeadId());
    groupedUsers.addAll(group.getTeamMemberIds().stream().collect(Collectors.toSet()));
});
不要使用forEach将元素添加到集合中

Set<String> groupedUsers = groups.stream()
    .flatMap(g -> Stream.concat(
        Stream.of(g.getTeamLeadId()), g.getTeamMemberIds().stream()))
    .collect(toSet());
或者只使用普通的旧增强for循环。流在这里没有任何明显的优势。

不要使用forEach将元素添加到集合中

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

或者只使用普通的旧增强for循环。流在这里没有任何明显的优势。

您可以跳过groups.stream.forEach中的流创建,因为


由于在JIT中进行了多年的循环优化,流通常比常规迭代成本更高。

您可以跳过groups.stream.forEach中的流创建,因为

由于在JIT中进行了多年的循环优化,流通常比常规迭代成本更高。

甚至可能是:

    Set<String> groupedUsers = new HashSet<>();
    groups.forEach(x -> {
        groupedUsers.add(x.getTeamLeadId());
        groupedUsers.addAll(x.getTeamMemberIds());
    });
甚至可能是:

    Set<String> groupedUsers = new HashSet<>();
    groups.forEach(x -> {
        groupedUsers.add(x.getTeamLeadId());
        groupedUsers.addAll(x.getTeamMemberIds());
    });
嗯,流API和lambdas在这里没有任何优势

优化此流以收集

如果我正确理解了你的单词的意思,那么我会选择老式的foreach:

如果你只有一把锤子,一切看起来都像钉子

嗯,流API和lambdas在这里没有任何优势

优化此流以收集

如果我正确理解了你的单词的意思,那么我会选择老式的foreach:

如果你只有一把锤子,一切看起来都像钉子


这是如何回答这个问题的?@Eugene Streams比常规迭代成本更高。很难说优化流意味着什么。带有flatMap的流将更具可读性,但常规for循环将更快。这如何回答这个问题?@Eugene流比常规迭代成本更高。很难说优化流意味着什么。带有flatMap的流将更具可读性,但常规for循环将更快。我认为您最终的回答与Karol相同。如果我没有误解你的意图的话。我想你最后的回答和卡罗尔一样。如果我没有误解这里的意图的话。这和这里存在的其他答案不一样吗?或者,如果你是说这比他们有性能优势吗?@nullpointer-no,不是。它没有任何与流和lambda相关的开销。我相信这不是使用流API的情况。通过其他答案,我的意思是,例如,不使用流。我想比较一下你的代码和他们的代码的性能。@ETO和lambda不是流,如果我们在讨论中偶然谈到的话。@KarolDowbecki是的,我知道。但是,在这种特殊情况下,使用lambda并不会优化任何东西。这与这里存在的其他答案不一样吗?或者,如果你是说这比他们有性能优势吗?@nullpointer-no,不是。它没有任何与流和lambda相关的开销。我相信这不是使用流API的情况。通过其他答案,我的意思是,例如,不使用流。我想比较一下你的代码和他们的代码的性能。@ETO和lambda不是流,如果我们在讨论中偶然谈到的话。@KarolDowbecki是的,我知道。但是在这种特殊情况下,使用lambda不会优化任何内容。IMHO,您应该定义优化此流主要是为了让问题清楚。IMHO,您应该定义优化此流主要是为了让问题清楚。