Java 8 Streams 映射对象的浅拷贝,使用流进行交叉连接
我的输入是:
List<Map<String, String>> = [{1=a, 2=b, 3=c},
{1=d, 2=e, 3=f}]
List<String> = [x, y, z]
预期输出是:
[
{1=a, 2=b, 3=c, 4=x},
{1=a, 2=b, 3=c, 4=y},
{1=a, 2=b, 3=c, 4=z},
{1=d, 2=e, 3=f, 4=x},
{1=d, 2=e, 3=f, 4=y},
{1=d, 2=e, 3=f, 4=z}
]
我的代码:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class ExplodeData {
public static void main(String[] args) {
List<Map<String, String>> listOfMap = List.of(
new HashMap<>(Map.of("1", "a", "2", "b", "3", "c")),
new HashMap<>(Map.of("1", "d", "2", "e", "3", "f"))
);
List<String> stringList = new ArrayList<>();
stringList.add("x");
stringList.add("y");
stringList.add("z");
listOfMap.forEach(System.out::println);
System.out.println(stringList + "\n\n");
List<Map<String, String>> result = new ArrayList<>();
for (Map<String, String> eachMap: listOfMap) {
for (String eachString: stringList) {
Map<String, String> newEntry = new HashMap<>();
newEntry.putAll(eachMap);
newEntry.put("4", eachString);
result.add(newEntry);
}
}
System.out.println("Expected Result using for loops");
result.forEach(System.out::println);
List<Map<String, String>> result2 = stringList
.stream()
.flatMap(each -> listOfMap.stream().peek(entry -> entry.put("4", each)))
.collect(Collectors.toList());
System.out.println("\n\nResult using streams");
result2.forEach(System.out::println);
}
}
问题: 我想将给出正确结果的 for 循环转换为流。我当前的流代码给出了正确的结果大小,即(listOfMap * stringList),但由于浅复制,新键的值被覆盖。
当前输出
Expected Result using for loops
{1=a, 2=b, 3=c, 4=x}
{1=a, 2=b, 3=c, 4=y}
{1=a, 2=b, 3=c, 4=z}
{1=d, 2=e, 3=f, 4=x}
{1=d, 2=e, 3=f, 4=y}
{1=d, 2=e, 3=f, 4=z}
Result using streams
{1=a, 2=b, 3=c, 4=z}
{1=d, 2=e, 3=f, 4=z}
{1=a, 2=b, 3=c, 4=z}
{1=d, 2=e, 3=f, 4=z}
{1=a, 2=b, 3=c, 4=z}
{1=d, 2=e, 3=f, 4=z}
感谢您的帮助。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您可以将
flatMap()
与生成新地图流的函数一起使用,就像循环版本一样,并将所有内容收集回列表中。您的流版本会就地修改现有地图,并不断用新元素覆盖之前添加的"4"
元素。输出
You can use
flatMap()
with a function that generates a stream of new maps, much like the loop version does, and collect everything back into a list. Your stream version modifies existing maps in-place, and keeps overwriting previously added"4"
elements with new ones.outputs
这是避免使用
flatMap
的一种方法。mapmulti
创建一个新地图并使用新元素对其进行修改打印
mapMulti 是在 Java 16 中引入的。
Here is one way which avoids using
flatMap
.mapmulti
to create a new map and modify it with the new elementsprints
mapMulti was introduced in Java 16.