java - 哪个是 fork 嵌套对象列表列表的有效方法? java 8平面图与每个?

标签 java foreach java-8 java-stream

我有一个 Terminal 对象:

class Terminal{

    List<TerminalPeriodApplicability> periods= new ArrayList<>();
    //few other attributes

    //getters & setters

}

TerminalPeriodApplicability 对象:

class TerminalPeriodApplicability{

    String name;
    boolean isRequired;
    //getters & setters
}

我想根据 isRequired 将 TerminalPeriodApplicability 的名称分成 optionalmandatory Set 的值。

我已经尝试了两种方法。一个有两个 forEach,另一个有 flatMap

List<Terminal> terminals= getTerminals();
Set<String> mandatoryPeriods = new HashSet<>();
Set<String> optionalPeriods = new HashSet<>();

方法 1:

terminals.forEach(terminal -> terminal.getApplicablePeriods().forEach(period->{
    if(period.getIsRequired())
        mandatoryPeriods.add(period.name());
    else
        optionalPeriods.add(period.name());
}));

方法 2:

List<TerminalPeriodApplicability> applicablePeriods = terminals
                .stream()
                .flatMap(terminal -> terminal.getApplicablePeriods().stream())
                .collect(Collectors.toList());

applicablePeriods.forEach(period->{
    if(period.getIsRequired())
        mandatoryPeriods.add(period.name());
    else
        optionalPeriods.add(period.name());
});

我想知道哪种方法在时间和空间复杂度方面更有效。或者有什么更好的方案来解决这个问题?

最佳答案

您可以在 flatMap 版本中使用不同的终端操作 - partitioningBy 而不是 toList - 并避免第二个 forEach:

Map<Boolean,List<TerminalPeriodApplicability>> periods = terminals
            .stream()
            .flatMap(terminal -> terminal.getApplicablePeriods().stream())
            .collect(Collectors.partitioningBy(TerminalPeriodApplicability::getIsRequired);

Map<Boolean,Set<TerminalPeriodApplicability>> periods = terminals
            .stream()
            .flatMap(terminal -> terminal.getApplicablePeriods().stream())
            .collect(Collectors.partitioningBy(TerminalPeriodApplicability::getIsRequired,
                                               Collectors.toSet());

更正:由于您希望两个 Set 包含 String 而不是 TerminalPeriodApplicability 实例,因此它应该是:

Map<Boolean,Set<String>> periods = terminals
            .stream()
            .flatMap(terminal -> terminal.getApplicablePeriods().stream())
            .collect(Collectors.partitioningBy(TerminalPeriodApplicability::getIsRequired,
                                               Collectors.mapping(TerminalPeriodApplicability::name,
                                                                  Collectors.toSet()));

关于java - 哪个是 fork 嵌套对象列表列表的有效方法? java 8平面图与每个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56001904/

相关文章:

java - 线程池任务列表更新问题

java - 从 ArrayList<Object> 转换为 ArrayList<Custom> 类会引发错误,而从 Object 转换为 Custom 则不会

java - 如何使用 Java 创建图像?

php - codeigniter - 未初始化的字符串偏移量 : 0 and Illegal string offset

php yalinqo - 遍历结果

java - ConcurrentModificationException : . add() 与 .addAll()

Java8 和 Aspectj 插件不兼容?

Java 8 方法引用静态 void 方法

java - 了解 Java 中的 Try-Catch 和异常处理

java - 检索多个子分支 Firebase