java - 如何使用 Java 8 Streams 在一次迭代中对 2 个不同的字段进行平面映射?

标签 java functional-programming java-8 java-stream

如果我有一个 List,其中每个元素包含 2 个 List 字段,我如何通过主列表在一次迭代中合并所有包含的列表。

换句话说,使用流以函数形式表达以下命令式代码的最佳方式是什么?

public class App {
    public static void main(String[] args) throws InterruptedException {
        List<Item> items = asList(new Item(singletonList("A"), singletonList("B")),
                new Item(singletonList("C"), singletonList("D"))
        );

        List<String> set1 = new ArrayList<>(), set2 = new ArrayList<>();
        for (Item item : items) {
            set1.addAll(item.set1);
            set2.addAll(item.set2);
        }
    }

    private static class Item {
        public final List<String> set1, set2;

        public Item(List<String> set1, List<String> set2) {
            this.set1 = set1;
            this.set2 = set2;
        }
    }
}

最佳答案

您要做的是使用 2 个不同的收集器收集 Stream 管道的结果。此外,每个收集器都需要对 List<String> 进行平面映射。当前流项目的。

此任务没有内置收集器,但您可以使用 StreamEx提供此类收集器的图书馆:

Item item = StreamEx.of(items)
                    .collect(MoreCollectors.pairing(
                       MoreCollectors.flatMapping(i -> i.set1.stream(), Collectors.toList()),
                       MoreCollectors.flatMapping(i -> i.set2.stream(), Collectors.toList()),
                       Item::new)
                    );

此代码将两个收集器配对,将每个收集器平面映射到 List 中并将结果存储到 Item 中.这Item将包含您的 set1set2变量。

Collection 家flatMapping将在 Java 9 ( see this mail ) 中可用。

关于java - 如何使用 Java 8 Streams 在一次迭代中对 2 个不同的字段进行平面映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34491067/

相关文章:

java - JavaFX WebEngine 中的 Google map 热图错误

python 可重用的用户错误处理

javascript - 使用函数继承时, `instanceof` 相当于什么?

Scala PartialFunction 可以是 Monoid 吗?

java - 如何创建具有映射值的 map ?

javascript - 如何将 Javascript native 类型从 Java 传递给 Nashorn 对象?

java - 正确使用 TransportClient 进行 Elasticsearch

java - 将嵌套 java 对象转换为 Jackson JSON

java - (Eclipse) useBean 类属性的值无效

java - 使用 Stream-Java 8 替换文件中的文本