Получение ошибочного индекса при итерации потока Java 8 - PullRequest
0 голосов
/ 25 июня 2019

Часть нашего приложения читает CSV-файл и преобразует его в список эквивалентных Java-объектов.Дальнейшая обработка выполняется следующим образом:

List<MyDO> dataList = ...
try{    
       List<MyDO> processedList = dataList
               .stream()
               .filter(...)//some filter condition
               .map(...)//some validation & processing
               .collect(Collectors.toList());  
}catch(Exception e){
  logger.error("Invalid data found at "+i);
}

Требуется получить индекс (i), по которому были найдены недопустимые данные, такие как непарсируемое значение типа int.Я попытался использовать IntStream как

IntStream.range(0, dataList.size())
        .filter(i -> ...)
        .mapToObj(i -> {
             MyDO myDO = dataList.get(i);
             ...// some error at i
         })
        .collect(toList()); 

Но этот ошибочный i нельзя присвоить переменной вне потока.Можно ли вынуть и зарегистрировать этот индекс?

1 Ответ

0 голосов
/ 26 июня 2019

Просто предоставьте контекстную информацию в выделенном исключении.

IntStream.range(0, dataList.size())
    .filter(i -> ...)
    .mapToObj(i -> {
         MyDO myDO = dataList.get(i);
         try {
         ...// some error at i
         } catch(Exception ex) {
             throw new IllegalStateException("at index "+i, ex);
         }
     })
    .collect(toList());

Вы также можете использовать пользовательский тип исключения, содержащий индекс в качестве значения int, для упрощения обработки (в случае, если вы хотите сделать больше, чем просто ведение журнала). Это исключение также может принимать соответствующие MyDO.

Как правило, здесь может быть проще использовать обычный цикл:

List<MyDO> processedList = new ArrayList<>(dataList.size());
for(int i = 0, num = dataList.size(); i < num; i++) {
    if(...) { // your filter criteria
        MyDO myDO = dataList.get(i);
        try {
        ...// some error at i
        } catch(Exception ex) {
            throw new IllegalStateException("at index "+i, ex);
        }
        processedList.add(myDO);
    }
}

или

List<MyDO> processedList = new ArrayList<>(dataList.size());
for(int i = 0, num = dataList.size(); i < num; i++) {
    if(...) { // your filter criteria
        MyDO myDO = dataList.get(i);
        try {
        ...// some error at i
        } catch(Exception ex) {
            logger.error("Invalid data found at "+i);
            break;
        }
        processedList.add(myDO);
    }
}

чтобы получить эффект вашего примера обработчика исключений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...