访问流中上一步的元素或将元素作为“参数”传递到下一步?

Sta*_*Log 5 java java-8 java-stream

访问流前一步元素的好方法是什么?

此处的示例从父流(字符串)开始,并将它们 flatMaps 到每个父级的两个子级(整数)。在我处理 Integer 子级 (forEach) 的步骤中,我想“记住”父 String 是什么('parentFromPreviousStep' 编译错误)。

显而易见的解决方案是为 String 和 Integer 引入一个持有者类,并在 flatMap 中产生这样的持有者对象的流。但这似乎有点笨拙,我想知道是否有办法访问这样一个链中的“前一个元素”或“传递参数”(不引入特殊的持有者类)。

    List<String> parents = new ArrayList();
    parents.add("parentA");
    parents.add("parentB");
    parents.add("parentC");

    parents.stream()
            .flatMap(parent -> {
                List<Integer> children = new ArrayList<>();
                children.add(1);
                children.add(2);
                return children.stream();
            }).forEach(child -> System.out.println(child + ", my parent is: ???" + parentFromPreviousStep));
Run Code Online (Sandbox Code Playgroud)

背景:这实际上发生在 Nashorn 中,其想法是为应用程序提供 JavaScript 脚本代码,而无需部署 Java 应用程序。这就是为什么我不想为我的两个业务对象(这里简化为 String 和 Integer)引入一个特殊的 Java 持有者类。【上面的Java代码用Nashorn写的差不多,流函数是Java,不是JavaScript。】

Jud*_*han 0

子项聚合到父项,嗯……听起来像键值对。地图!

于是,我就用这种方式尝试了一下。它起作用了。希望这会有所帮助。

    parents.stream()
            .flatMap(parent -> {
                List<Integer> children = new ArrayList<>();
                children.add(1);
                children.add(2);

                Map<String, List<Integer>> stringListMap = new HashMap<String, List<Integer>>();
                stringListMap.put(parent, children);
                return stringListMap.entrySet().stream();
            })
            .forEach(entry -> {
                entry.getValue().stream().forEach(val -> System.out.println(val + ", my parent is: ???" + entry.getKey()));
            });
Run Code Online (Sandbox Code Playgroud)