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

6

我正在尝试实现以下场景。

enter image description here

我有一个名为oldList的列表,我正在尝试使用Stream API将每个元素的出现次数乘以4并放入一个名为newList的列表中。旧列表的大小未知,每次它可能会以不同的大小出现。
我已经使用两个传统的循环解决了这个问题,如下所示;
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;
}

但我刚学习了Stream API,想要用它来巩固我的知识。

2个回答

20
你可以使用 flatMap 将原始的 List 的每个元素转换为一个包含 4 个元素的 Stream,然后生成一个包含所有这些元素的单一 Stream
List<Integer> mapHourlyToQuarterlyBased =
    oldList.stream()
           .flatMap(i -> Collections.nCopies(4, i).stream())
           .collect(Collectors.toList());

1
那里使用了Collections非常好,Eran。 - Yassin Hajaj

10
你可以使用 flatMap 来实现这一点:
List<Integer> result = list.stream().flatMap(i -> Stream.of(i,i,i,i)).collect(Collectors.toList());

或者以更广泛的方式来说:

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

此代码针对输入列表中的每个元素,创建一个由该元素重复4次并进行扁平映射的流。然后将所有元素收集到一个列表中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接