java - 在添加到 map 之前如何过滤收集器中方法调用的数据

标签 java java-stream

我有结构

interface Foo{
   List<Bar> getBars();
}

interface Bar{
   List<Number> getValues();
}

并列出List<Foo> foos

我想要的是创建看起来或多或少像这样的 map ,排除 foo 没有 bar 或 bar 没有值的条目。

{
  fooid :{
              barId : bar
           }
}

显然我的第一个想法是做

    foos.stream().filter(f->!f.getBars().isEmpty())
    .collect( Collectors.toMap(
        f->f.id(),
        f->f.getBars().stream().filter(b->!b.getValues().isEmpty())
                 .collect(Collectors.toMap( b->b.id(),b->b.getValues()                       
    ))));

问题是我正在调用方法 getValues两次而且这是昂贵的方法, 处理此类调用的最佳实践是什么?

最佳答案

认为这就是您正在寻找的:

private static void doMap(List<Foo> foos) {
    foos.stream()
        .filter(foo -> !foo.getBars()
                           .isEmpty())
        .map(foo -> new SimpleEntry<>(foo.getId(), foo.getBars()
                                                      .stream()
                                                      .map(bar -> new SimpleEntry<>(bar.getId(), bar.getValues()))
                                                      .filter(entry -> !entry.getValue()
                                                                             .isEmpty())
                                                      .collect(entriesToMapCollector())))
        .filter(entry -> !entry.getValue().isEmpty())
        .collect(entriesToMapCollector());
}

private static <K, V> Collector<Entry<K, V>, ?, Map<K, V>> entriesToMapCollector() {
    return Collectors.toMap(Entry::getKey, Entry::getValue);
}

(出于可读性、可维护性和一切能力的考虑,我强烈提倡采用更命令式的方法 - 请不要在生产代码中这样做)

关于java - 在添加到 map 之前如何过滤收集器中方法调用的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55498481/

相关文章:

java - 使用 Sutherland-Hodgman 算法时多边形裁剪不起作用

java - 如何将整数转换为十六进制有符号2的补码:

java - 使用java流的不兼容类型错误

java - 如何使用 Stream.flatmap 将被展平的对象与展平的对象组合起来

使用svnclientadapter提交文件的java程序

java - 为什么我的 'userID' 初始化为 0 而不是从 PHP 发送的内容?

java - IntStream.range(0, 1_000_000) 在 113383 停止(Project Euler : Longest Collatz Sequence)

Java Stream > 是否可以将 "orElseGet"内联到父流中?

java - TFS 无法从 Ant/JUnit 构建中找到单元测试结果

java - 如何获取 IntStream.map.forEach 的索引?