将列表中每个元素的出现次数乘以4

Ad *_*tum 6 java java-8 java-stream

我试图实现以下方案.

在此输入图像描述

我有一个oldList,我试图将每个元素的出现次数乘以4,并newList使用Stream API 将它们放入a中.oldList的大小未知,每次都可能出现不同的大小.

我已经用两个传统的循环解决了这个问题,如下所示:

private List< Integer > mapHourlyToQuarterlyBased( final List< Integer > oldList )
{

   List< Integer > newList = new ArrayList<>();

   for( Integer integer : oldList )
   {
      for( int i = 0; i < 4; i++ )
      {
       newList.add( integer );
      }
   }

   return newList;
}
Run Code Online (Sandbox Code Playgroud)

但我已经学习了新的Stream API,并希望用它来巩固我的知识.

Era*_*ran 16

您可以使用a 从原始元素flatMap生成Stream4个元素List,然后生成Stream所有这些元素中的一个元素.

List<Integer> mapHourlyToQuarterlyBased =
    oldList.stream()
           .flatMap(i -> Collections.nCopies(4, i).stream())
           .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)


Tun*_*aki 10

您可以使用以下方法实现flatMap:

List<Integer> result = list.stream().flatMap(i -> Stream.of(i,i,i,i)).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

或者以更通用的方式:

List<Integer> result = list.stream().flatMap(i -> Stream.generate(() -> i).limit(4)).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

对于输入列表中的每个元素,这将创建一个由此元素组成的流,重复4次并对其进行平面映射.然后将所有元素收集到列表中.