Как условно установить текущее значение элемента, используя потоки Java? - PullRequest
2 голосов
/ 05 мая 2020

Чтобы упростить мою проблему, предположим, что у меня есть список строк при преобразовании этой строки в целые числа, с которыми я могу столкнуться NumberFormatException, из элемента, который я получаю это исключение, мне нужно один раз пометить все элементы-преемники как неудачные. Есть ли лучший способ передать состояние предыдущего элемента или улучшить этот код?

  AtomicBoolean isInvalidRequest = new AtomicBoolean(false);
  list.stream().map(ele -> {
      if (!isInvalidRequest.get()) {
        try {
          Integer.parseInt(ele);
        } catch (NumberFormatException e) {
          isInvalidRequest = new AtomicBoolean(true);
        }
        return ele;
      } else {
        return "invalid previous element";
      }
    });

Учитывая список элементов List("1", "2", "A", "4", "3")

Исключенный вывод элементов List("1", "2", "A", "invalid previous element", "invalid previous element")

Редактировать

Как уже упоминалось, это упрощенная версия моей актуальной проблемы. В реальной проблеме мой отказ - это вызов HTTP POST, мне нужно отказать все последующие элементы из элемента, я получаю ответ об ошибке.

Ответы [ 2 ]

2 голосов
/ 05 мая 2020

Странное требование менять элементы после недействительного. Следствием этого является отсутствие каких-либо изменений, если только последний элемент недействителен.

Обычно вас интересует индекс первого недопустимого элемента, например

OptionalInt firstInvalid = IntStream.range(0, list.size())
        .filter(ix -> {
            try {
                Integer.parseInt(list.get(ix));
                return false;
            } catch (NumberFormatException e) {
                return true;
            }
        })
        .findFirst();

Тогда , если вы действительно хотите изменить список описанным образом, вы можете использовать

firstInvalid.ifPresent(ix ->
    list.subList(ix+1, list.size()).replaceAll(s -> "invalid previous element"));

Обратите внимание, что такое разделение задач делает код более эффективным. Поиск первого недопустимого индекса является коротким замыканием, возвращаясь после обнаружения первого недопустимого элемента, вместо того, чтобы работать с последующими элементами. В этом случае установка для последующих элементов предварительно определенного значения происходит безоговорочно. Когда все элементы действительны, первый шаг должен проверить их все, но затем второй шаг полностью пропускается.

0 голосов
/ 05 мая 2020

Я использовал этот фрагмент кода

AtomicBoolean isInvalidRequest = new AtomicBoolean(false);
     ArrayList<String> list = new ArrayList<>();
    list.add("1");
    list.add("2");
    list.add("A");
    list.add("4");
    list.add("5");
    boolean val = false; 

    List<String> newList =  list.stream().map(ele -> {
     if(!isInvalidRequest.get()) {

    try{
      Integer.parseInt(ele);
      return ele;
    } catch (Exception e) {
      isInvalidRequest.set(true);
      return "string wrong";
    } 
     } else {
       return "previous string wrong";
     }
  })
  .collect(Collectors.toList());

   newList.stream().forEach(ele -> System.out.println(ele)); 

Результат был

1
2
string wrong
previous string wrong
previous string wrong

Но имейте в виду, что изменение состояния или наличие побочных эффектов изнутри функции карты не очень хорошо идея. Так что вы можете это изменить.

...