收集后对Java 8流中的对象调用方法
假设我有以下代码:收集后对Java 8流中的对象调用方法,java,lambda,java-stream,Java,Lambda,Java Stream,假设我有以下代码: Map<Consumer, Item> map = myStream.parallel() .filter(Objects::nonNull) .collect(Collectors.toConcurrentMap(e->e, e->e, mergeFunction)); item.setDate(item.getOneDate()); 在代码完成之前,按顺序循环项目,放入一个映射,最
Map<Consumer, Item> map = myStream.parallel()
.filter(Objects::nonNull)
.collect(Collectors.toConcurrentMap(e->e,
e->e, mergeFunction));
item.setDate(item.getOneDate());
在代码完成之前,按顺序循环项目,放入一个映射,最后调用一段类似上面的代码,设置一个“日期”
item.setDate(item.getOneDate());
while(iterator.hasNext()) {
Item blah = iterator.next();
....
// code for putting into map
...
blah.setDate(blah.getOneDate());
}
不知道如何使用Java8流实现这一点<代码>forEach
peek
?如果必须在collect
操作后执行此操作,只需使用forEach
:
item.setDate(item.getOneDate());
map.forEach((k, v) -> {...});
如果您只对价值感兴趣:
item.setDate(item.getOneDate());
map.values().forEach(item -> {...});
或仅限钥匙:
item.setDate(item.getOneDate());
map.keySet().forEach(item -> {...});
这将是,但我将使用:
item.setDate(item.getOneDate());
在我看来,这个用例使许多反对使用peek()
进行状态修改的方法无效,因为它基本上没有副作用(假设元素不再可以从流源访问)。它绝对符合的唯一严格要求。我同意。map
操作更干净。如果不需要中间对象,只需返回相同的对象:
item.setDate(item.getOneDate());
myStream.parallelStream()
.map(i -> { i.setDate(i.getOneDate()); return i; })
...
这样说,我会避免在<代码>流中间的对象发生突变。这是一种不好的做法。
map()
在收集之前对您不起作用?显示您的非流尝试,以更好地说明您的描述。因为并行化是为了加快速度,而在这一过程中,对我来说,在映射中迭代会减慢速度。如果我不必循环就能完成,那就太理想了。@SS“你能告诉我为什么流方法有一个合并函数,但在命令式方法中没有处理重复键的逻辑。他在迭代方法中根本没有显示他的插入代码。不管怎样,考虑到键映射器和值映射器都是e->e
@shmosel,该收集器看起来都像伪代码。看到你的回答后我很好奇。如果确实需要合并函数,这意味着我们不能简单地执行.peek(item->item.setDate(item.getOneDate())
,因为这甚至会设置合并函数丢弃的对象的日期,这可能是问题,也可能不是问题。为什么会是问题?
item.setDate(item.getOneDate());