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

Nes*_*aev 9 java java-8 java-stream

假设我有一个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);
}
Run Code Online (Sandbox Code Playgroud)

这个例子是为了简单起见 - 实际的方法是做其他事情,而不仅仅是弄乱对象的UUID.

无论如何,如何在上述场景中使用void方法?当然,我可以让方法返回转换后的对象,但这是除了点之外并且违反了设计(方法应该是无效的).

Mur*_*göz 22

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

List<MyObject> objList = ...
objList.forEach(e -> transform(e, e.getUuid()));
return objList;
Run Code Online (Sandbox Code Playgroud)


Eug*_*ene 6

如果您确定这是您想要做的,那么使用peek而不是map

  • 这不是一个好方法,因为peek的设计仅用于调试目的。https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#peek-java.util.function.Consumer- (2认同)
  • 对于迟到的回复表示歉意:此外,由于 peek 旨在进行调试,因此 JRE 可以完全跳过对 peek 的调用。https://rules.sonarsource.com/java/RSPEC-3864 (2认同)

Flo*_*own 6

除了Eugene的答案,您可以使用Stream::map如下:

objList.stream()
   .map(e -> {
      transform(e, e.getUuid()); 
      return e;
   }).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

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

相反,您希望为您的每个条目应用一种方法List.

因此你应该使用Collection::forEach并返回List.

List<MyObject> objList = ...;
objList.forEach(e -> transform(e, e.getUuid()));
return objList;
Run Code Online (Sandbox Code Playgroud)