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

时间:2017-01-18 12:51:11

标签: 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);
}

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

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

4 个答案:

答案 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());