Как использовать findAny () и не возвращать ноль - PullRequest
0 голосов
/ 28 августа 2018

Я хотел бы знать, как я могу использовать findAny() в потоке данных, когда он не находит совпадений, он не возвращает null.

String CountryFinal= "Spain";
List<ParContriesTO> listContries= new ArrayList<SelectItem>();
listContries.add(new SelectItem(215, "Germany"));
Integer idCountry = (int) listContries.stream()
                    .filter(country -> country.getNoCountry().equals(CountryFinal))
                    .findAny().orElse(null).getCoCountry();

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Stream::findAny возвращает Optional и его метод Optional::findAny, согласно документации, есть 4 способа возврата T:

  1. Optional::get возвращает T или броски NoSuchElementException
  2. Optional::orElse возвращает T или значение по умолчанию
  3. Optional::orElseGet возвращает T или значение, указанное в Supplier
  4. Optional::orElseThrow возвращает T или создает пользовательское исключение

Насколько я понимаю, вы ищете второй или третий метод, который возвращает определенное значение в случае, если источником является null. Вы можете вернуть нулевой объект, используя шаблон Null-Object , который представляет объект, который является действительным, но ничего не делает. Или вы можете использовать null.

Я предлагаю вам получить страну за до , вы разрешите вернуть null или что-либо еще и использовать метод getCoCountry() (я полагаю, Country::getCoCountry возвращает либо int или Integer) - в противном случае то, что вы сделали, вернет NullPointerException.

Попробуйте следующий фрагмент:

Integer idCountry = listContries.stream()               // Stream
    .filter(c -> countryFinal.equals(c.getNoCountry())) // Get one equals to "Spain"
    .findFirst()                                        // Get Optional<Country>
    .map(Country::getCoCountry)                         // If exists, get its code
    .orElse(0);                                         // Or else return an invalid code

Обратите внимание, что нет необходимости фильтровать по названию страны, а затем проверять равенство, так как вы ожидаете, что есть только один "Spain".

0 голосов
/ 28 августа 2018

Подход к вызову getCoCountry как последнего, как правило, плох. Что вы можете сделать, это:

listContries.stream()
            .filter(country -> country.getNoCountry()
            .equals(CountryFinal))
            .findAny().map(Country::getCoCountry).orElse(WHATEVER_YOU_WANT);

Чтобы уточнить: findAny возвращает Optional, который может содержать экземпляр страны. Вы можете смело вызывать getCoCountry в map. Это значение типа Optional. На этом этапе вы все еще в безопасности, поскольку у вас все еще есть Optional, который МОЖЕТ содержать результат Integer. В конце концов, вы можете использовать orElse, чтобы решить, что вы хотите иметь, если экземпляр равен нулю.

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