Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
收集后对Java 8流中的对象调用方法_Java_Lambda_Java Stream - Fatal编程技术网

收集后对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());