Java使用void方法进行流映射?

2022-09-02 02:18:04

假设我有一个void方法,它只对对象进行转换,而不返回任何值,我想在stream 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方法怎么可能呢?当然,我可以让方法返回转换后的对象,但这不是重点,并且违反了设计(该方法应该是无效的)。


答案 1

似乎这是强制使用java 8流的情况。相反,你可以用 forEach 来实现它。

List<MyObject> objList = ...
objList.forEach(e -> transform(e, e.getUuid()));
return objList;

答案 2

除了尤金的答案,你可以这样使用:Stream::map

objList.stream()
   .map(e -> {
      transform(e, e.getUuid()); 
      return e;
   }).collect(Collectors.toList());

实际上,您不想转换当前元素并将其收集到新的.List

相反,您希望对 中的每个条目应用一个方法。List

因此,您应该使用并返回 .Collection::forEachList

List<MyObject> objList = ...;
objList.forEach(e -> transform(e, e.getUuid()));
return objList;

推荐