Java 8将整数流映射到<t>流

时间:2017-10-05 03:14:04

标签: java-8 java-stream

我是Java 8功能中的完整菜鸟,我试图通过处理整数流来生成Double对象流,如下所示:

IntStream.range(0, 10).forEach(integer -> 50.0);

所以我最终得到了一个看起来像的流:

{50.0, 50.0, ... 50.0}

现在,我知道forEach不能像那样工作,而且这个具体案例可以用其他更简单的方式解决,但这只是为了说明。

基本上,我正在寻找的类似于forEach,除了它期望每个元素的返回值并且也能够生成流。

3 个答案:

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