假设我有一个void方法,它只对对象进行转换,而不返回任何值,我想在流map()函数的上下文中使用它,如下所示:
public List<MyObject> getList(){
List<MyObject> objList = ...
return objList.stream().map(e -> transform(e, e.getUuid())).collect(Collectors.toList());
}
private void transform(MyObject obj, String value){
obj.setUuid("prefix" + value);
}
这个例子是为了简单起见 - 实际的方法是做其他事情,而不仅仅是弄乱对象的UUID。
无论如何,如何在上述场景中使用void方法? 当然,我可以让方法返回转换后的对象,但除此之外还有违反设计的方法(方法应该是无效的)。
答案 0 :(得分:19)
似乎这是强制使用java 8流的情况。相反,你可以用forEach实现它。
List<MyObject> objList = ...
objList.forEach(e -> transform(e, e.getUuid()));
return objList;
答案 1 :(得分:6)
如果你确定这是你想要做的,那么使用 peek 而不是map
答案 2 :(得分:5)
除了Eugene's answer之外,你可以像这样使用<option data-price="60" value="chargerOne"></option>
:
$(this).data('price')
实际上,您并不想转换当前元素并将其收集到新的Stream::map
中。
相反,您希望为objList.stream()
.map(e -> {
transform(e, e.getUuid());
return e;
}).collect(Collectors.toList());
中的每个条目应用一种方法。
因此,您应该使用List
并返回List
。
Collection::forEach
答案 3 :(得分:2)
您可以使用 peek(Consumer<? super T> action)
方法。它接受一个消费者作为参数,对每个元素执行一个动作并返回一个流。
objList.stream().peek(e -> transform(e,e.getUuid())).collect(Collectors.toList());