2016-08-16 2 views
6

Я пытаюсь выполнить следующий сценарий.Умножить появление каждого элемента в списке на 4

enter image description here

У меня есть oldList, и я пытаюсь умножить вхождения каждого элемента на 4 и поместить их в newList с помощью потока API. Размер 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; 
} 

, но я недавно научился Stream API и хотел бы использовать его для консолидации моих знаний.

ответ

16

Вы можете использовать flatMap для получения Stream из 4 элементов из каждого элемента исходного List, а затем генерировать одну Stream всех этих элементов.

List<Integer> mapHourlyToQuarterlyBased = 
    oldList.stream() 
      .flatMap(i -> Collections.nCopies(4, i).stream()) 
      .collect(Collectors.toList()); 
+0

Протестировано и обработано плавно. Благодарю вас. –

+1

Очень приятное использование 'Collections' там Eran –

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 раз и плоские карты. Затем все элементы собираются в список.

Смежные вопросы