加倍流

pri*_*ain 19 java java-8 java-stream

我想加倍一个Stream(没有DoubleStream).意思是我从流开始并想要获得一个新流,其中旧流的每个元素都流式传输两次.所以1,2,3,4,4,5给了我们1,1,2,2,3,3,4,4,4,4,5,5.有没有这样的流操作?

Psh*_*emo 30

创建一个内部流,它将包含两次当前元素并flatMap此流.

stream.flatMap(e -> Stream.of(e,e))
Run Code Online (Sandbox Code Playgroud)

如果你想要乘以元素的数量,n你可以创建一个像这样的实用方法:

public static <T> Stream<T> multiplyElements(Stream<T> in, int n) {
    return in.flatMap(e -> IntStream.range(0, n).mapToObj(i -> e));
    //  we can also use    IntStream.rangeClosed(1, n) 
    //  but I am used to iterating from 0 to n (where n is excluded)
}
Run Code Online (Sandbox Code Playgroud)

(但尝试为此方法使用更好的名称,因为当前的方法可能不明确)

用法示例:

multiplyElements(Stream.of(1,2), 3).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

输出:

1
1
1
2
2
2
Run Code Online (Sandbox Code Playgroud)

  • `repeatEach()`可能是一个好名字:) (2认同)

ass*_*ias 6

您可以为每个原始元素创建一个包含2个元素的流,并对其进行flatMap:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 4, 5);
List<Integer> doubled = list.stream().flatMap(i -> Stream.of(i, i)).collect(toList());
Run Code Online (Sandbox Code Playgroud)

  • 恕我直言,你应该提到静态导入,如`Collectors.toList` (5认同)