2015-10-02 4 views
0

У меня есть вопрос относительно Java 8 и списков. Возможно ли инициализировать список проще, чем мой код ниже?Java 8 - список инициализации (список)

final List<List<ScheduleIntervalContainer>> weekScheduler = new ArrayList<>(); 

weekScheduler.add(0, new ArrayList<ScheduleIntervalContainer>()); 
weekScheduler.add(1, new ArrayList<ScheduleIntervalContainer>()); 
weekScheduler.add(2, new ArrayList<ScheduleIntervalContainer>()); 
weekScheduler.add(3, new ArrayList<ScheduleIntervalContainer>()); 
weekScheduler.add(4, new ArrayList<ScheduleIntervalContainer>()); 
weekScheduler.add(5, new ArrayList<ScheduleIntervalContainer>()); 
weekScheduler.add(6, new ArrayList<ScheduleIntervalContainer>()); 
+2

Вы можете сделать это в петле. –

+0

Я бы использовал цикл и спрятал его в классе «WeekScheduler», который расширяет ArrayList, а затем мне не нужно будет снова видеть код ... когда-либо. –

ответ

7

Вы можете использовать:

List<List<ScheduleIntervalContainer>> weekScheduler = 
    IntStream.rangeClosed(0, 6).mapToObj(i -> new ArrayList<ScheduleIntervalContainer>()) 
           .collect(Collectors.toList()); 

Это создаст Поток int значений, идущих от 0 до 6 (включительно), сопоставьте каждый из этих Интс к новому ArrayList вашего класса и собирать результат до List.

+0

Ваш код не работает для меня. Он жалуется на попытку конвертировать 'ArrayList ' в 'ArrayList '. – Tom

+2

@Tom Вы уверены, что вы правильно скопировали его? И правильно импортировал java.util.List? Этот код компилируется для меня (JDK 1.8.0_51) – Tunaki

+0

Да, я импортировал его правильно, но что-то еще кажется неправильным на моей стороне, потому что оно работает в [ideone] (http://ideone.com/x6xBgl). – Tom

2

Вы можете использовать цикл или IntStream.

final List<List<ScheduleIntervalContainer>> weekScheduler = new ArrayList<>(); 
IntStream.range(0, 7).forEach(day -> weekScheduler.add(new ArrayList<>())); 
+0

никогда не знал, что это было возможно 0.0 это опция java 8 exclusive? –

+0

@TomWellbrock Потоки и lambdas были добавлены в Java 8. Я предполагаю, что он будет доступен в Java 9;) –

+5

[Вы не должны использовать '' forEach' потока потока API для изменения состояния] (http://www.oracle.com/ webfolder/technetwork/учебники/moocjdk8/документы/week3/урок-3-3.pdf). Это обязательное программирование стиля в API функционального стиля. Вместо этого вы должны использовать комбинацию 'map' и' collect'. –

10

Лично я бы просто использовать for цикл:

List<List<ScheduleIntervalContainer>> weekScheduler = new ArrayList<>(); 
for (int i = 0; i < 7; i++) 
    weekScheduler.add(new ArrayList<>()); 

Однако, если вы хотите раствор Java 8:

List<List<ScheduleIntervalContainer>> weekScheduler 
     = Stream.generate(ArrayList<ScheduleIntervalContainer>::new) 
       .limit(7) 
       .collect(Collectors.toList()); 
0

Всякий раз, когда я код со списками, я использую для чтобы ускорить объявление. В вашем случае я бы очень хотел предложить цикл любого типа, но цикл for, вероятно, был бы самым простым.

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