我是Java 8功能中的完整菜鸟,我试图通过处理整数流来生成Double对象流,如下所示:
IntStream.range(0, 10).forEach(integer -> 50.0);
所以我最终得到了一个看起来像的流:
{50.0, 50.0, ... 50.0}
现在,我知道forEach
不能像那样工作,而且这个具体案例可以用其他更简单的方式解决,但这只是为了说明。
基本上,我正在寻找的类似于forEach
,除了它期望每个元素的返回值并且也能够生成流。
答案 0 :(得分:2)
一般来说,您正在谈论的操作类型是map operation:您希望将函数应用于列表的每个元素并返回这些结果的新列表。下面是一个将整数流转换为自定义类,然后将它们收集到List
中的示例:
IntStream.range(1, 10)
.mapToObj(n -> new MyClass(n))
.collect(Collectors.toList());
// Alternatively - using a method reference
IntStream.range(1, 10)
.mapToObj(MyClass::new)
.collect(Collectors.toList());
// Alternatively - convert from a stream of primitive ints to a stream
// of Integer objects (i.e. boxed ints) first so we can use methods not
// available on the IntStream object
IntStream.range(1, 10).boxed()
.map(MyClass::new)
.collect(Collectors.toList());
正如另一个答案中所提到的,您也可以针对您提到的具体案例使用mapToDouble
方法。
答案 1 :(得分:1)
您可以在整数流上使用map helper函数来执行此操作。请查看以下代码。
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class MapTest {
public static void main(String[] args) {
System.out.println(IntStream.range(0, 10).mapToDouble(number -> 50.0).boxed().collect(Collectors.toList()));
}
}
答案 2 :(得分:0)
您可以使用Stream.generate
代替Stream.range
。这更适合您的情况,因为您不使用范围:
List<Double> collect = Stream.generate(() -> Double.valueOf(50.0))
.limit(10).collect(Collectors.toList());