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。】
子项聚合到父项,嗯……听起来像键值对。地图!
于是,我就用这种方式尝试了一下。它起作用了。希望这会有所帮助。
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)
归档时间: |
|
查看次数: |
5972 次 |
最近记录: |