当前位置: 首页 > 面试题库 >

java8流映射在这里做什么?

章禄
2023-03-14
问题内容

我对java8流中map()forEach()方法之间的区别感到困惑。例如,

List<String> strings = Lists.newArrayList("1", "2");
Map<String, String> map = Maps.newHashMap();
strings.stream().map(s->map.put(s, s));
System.out.println(map);

我得到空的输出在这里,但如果我改变地图forEach()就像

List<String> strings = Lists.newArrayList("1", "2");
Map<String, String> map = Maps.newHashMap();
strings.stream().forEach(s->map.put(s, s));
System.out.println(map);

我可以得到

{1 = 1,2 = 2}

为什么只是没有运行map()方法?它们之间有什么区别?


问题答案:
strings.stream().map(s->map.put(s, s));

什么都不做,因为在执行终端操作之前不会处理流管道。因此,Map残留物为空。

在流管道中添加终端操作将导致map.put(s, s)针对Stream终端操作所需的每个元素执行操作(某些终端操作仅需要一个元素,而其他终端操作则需要的所有元素Stream)。

另一方面,第二个流管道:

strings.stream().forEach(s->map.put(s, s));

以终端操作-结束,该操作forEach对的每个元素执行Stream

也就是说,两个摘要都滥用Streams。为了根据的内容填充a Collection或a ,您应该使用,可以创建a 或a
并根据需要填充它。并有不同的目的。Map``Stream``collect()``Map``Collection``forEach``map

例如,创建一个Map

List<String> strings = Lists.newArrayList("1", "2");
Map<String, String> map = strings.stream()
                                 .collect(Collectors.toMap(Function.identity(),
                                                           Function.identity()));
System.out.println(map);


 类似资料:
  • 我正在从文件中读取值并获取列表。如下- 一旦我得到这个

  • 我有以下两门课: : : 我希望进行流操作,以便: 将映射到中的 的和分别合并到和中,对于所有具有相同id的s 为此,我编写了以下一段代码: 它的工作和输出如下: 但我相信有一种更好的方式可以达到同样的效果。任何一个指针都很好。

  • 假设我有一张房间清单 每个房间都有一份人员名单。 使用java8 streams,我想迭代房间列表,获取所有人员,在每个节点上执行一些方法(doSomething()),并获取所有过滤对象的列表。 这是使用java 8的最佳实践吗?

  • 我在迭代一个对象内的列表时遇到了一个问题,该对象内嵌在另一个映射中。我的目标是迭代这个列表并生成一个映射 ,我希望使用streams和lamdas来实现这一点。 我在上面看到了,我需要通过迭代FolderBo中的elementList从elementBo创建一个带有map 的映射。folderBo本身就在Modelbo的地图内。

  • 我正在尝试使用流将一个列表映射到另一个列表。 原始列表的某些元素无法映射。也就是说,映射函数可能无法找到合适的新值。 null 对更好的方法的建议?或者我应该把溪流全部挖开,用好的旧循环?

  • 我有一个类具有以下签名: 我想将映射到在单个流中同时包含stringA和stringB的 或: 当然他们都不编译,但你明白了。 编辑: 示例: