我对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
。
也就是说,两个摘要都滥用Stream
s。为了根据的内容填充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的 或: 当然他们都不编译,但你明白了。 编辑: 示例: