2016-03-17 3 views
2

У меня есть следующая проблема:Сбор результатов от метода дозирования вызывает

У меня есть метод, как следует, что можно взять коллекцию только до 500 имен в то время:

public Optional<ResultDTO> executeRequest(final int time, List<Name> names) 

У меня есть список 1000+ имена и, следовательно, я хочу разделить этот список из в подсписки от максимального размера 500 с использованием гуавы

List<List<Name>> nameBatches = Lists.partition(namesList, 500); 

и передать его на запрос, чтобы получить список ResultDTOs. Как это сделать в Java8?

ответ

0

Я не уверен, что в java 8 аналогичная функциональность была предоставлена. Конечно, вы можете использовать foreach с анонимной функцией, но это более нечитабельно, чем в java 8 с использованием List.subList().

решение в Java 7:

 final Integer sizeOfChunk = 3; 
     List<Integer> inputList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 0); 

     //Guava 
     List<List<Integer>> firstListOfLists = Lists.partition(inputList, sizeOfChunk); 

     //Java 7 
     List<List<Integer>> secondListOfLists = new ArrayList<List<Integer>>(); 
     for (int i=0; i<inputList.size()-sizeOfChunk; i+=sizeOfChunk) { 
      secondListOfLists.add(inputList.subList(i, i+sizeOfChunk)); 
     } 
     if (inputList.size() % sizeOfChunk != 0) { 
      secondListOfLists.add(inputList.subList(secondListOfLists.size()*sizeOfChunk, inputList.size())); 
     } 

     System.out.println("Guava: " + firstListOfLists); 
     System.out.println("Java 7: " + secondListOfLists); 

EDIT

После вашего комментария, то это будет:

List<Optional<ResultDTO>> results = nameBatches .stream().map(l -> executeRequest(something, l)).collect(Collectors.toList()); 
+0

Моя главная проблема в том, как я называю ExecuteRequest метод для каждой из партий имя и сохранить результаты. –

0

Вы должны создать IntStream для перебора куски в вашем списке и создавать под-списки на отдельном этапе сопоставления.

int chunkSize = 500; 
int size = namesList.size(); 
// calc the number of chunks 
int chunks = (size - 1)/chunkSize; 

List<List<Name>> res = IntStream 
    // range over all chunks 
    .range(0, chunks + 1) 
    // create sub-lists for each chunk 
    .mapToObj(
     n -> namesList.subList(n * chunkSize, Math.min(size, (n + 1) * chunkSize))) 
    // collect from Stream<List<String>> to List<List<String>> 
    .collect(Collectors.toList()); 

Edit: на основе вашего комментария

Моя главная проблема в том, как я называю ExecuteRequest метод для каждой из партий имя и сохранить результаты.

Просто добавьте .map(l -> executeRequest(time, l)) до collect вызова, а также изменить тип res к List<Optional<Object>>

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