Как конвертировать следующий метод в Java 8? - PullRequest
0 голосов
/ 03 января 2019

У меня есть объект List, и мне нужно взять первый элемент в списке, если он не нулевой или пустой.

Я пишу код ниже, используя Java, и теперь я хочу преобразовать его в Java 8.

    List<DD> container
    A<DD,DI> a;
    if(container!=null || !container.isEmpty()){
       for(DD dd:container)
       {
          a = dd.getPrescription();
          break;
       }
    }

Я конвертирую его следующим образом.

 DD detail = container.stream().findFirst().get();

Мне нужно знать, что это правильно?

Ответы [ 4 ]

0 голосов
/ 03 января 2019
The findFirst() method finds the first element in a Stream. This method is used when you specifically want the first element from a sequence.

a) container.stream().findFirst().orElse(null);
b) container.stream().filter(Objects::nonNull).findFirst().orElse(null);
c)container.stream().filter(StringUtils::isNotBlank).findFirst();
or as lambdas:
d)container.stream().filter(s -> StringUtils.isNotBlank(s)).findFirst();

e)container.stream().filter(StringUtils::isNotBlank).findFirst()

Для справки: - http://www.geekabyte.io/2015/01/using-optional-effectively-in-java-8.html

0 голосов
/ 03 января 2019

Это намного проще:

A<DD,DI> a = container.get(0).getPrescription();

Хотя это прямой перевод вашего исходного кода, вы, вероятно, намеревались что-то подобное:

A<DD,DI> a = container != null && !container.isEmpty()
    ? container.get(0).getPrescription()
    : null;
0 голосов
/ 03 января 2019

Начиная с JDK9, существует новый метод T requireNonNullElse (T obj, T defaultObj) , который по существу возвращает первый аргумент, если он не равен нулю, и в противном случае возвращает ненулевой-null второй аргумент.

Поэтому мы можем упростить ваш код до:

Objects.requireNonNullElse(container, Collections.emptyList())
       .stream()
       .findFirst()
       .map(DD::getPrescription);

Это возвращает Optional<T>, где T - любой тип getPrescription есть.в зависимости от контекста и того, подходит ли вам это, вы можете использовать .orElse(null); для получения значения, которое содержит необязательное значение, или же значение null, но в API Optional<T> есть также несколько других методов, которыеВы можете найти более полезным при извлечении значения из необязательного.

0 голосов
/ 03 января 2019

В вашем текущем коде есть критический недостаток, т. Е.

if(container!=null || !container.isEmpty())

это все еще может выдать NullPointerException (когда container == null), если условный оператор не изменен на &&. Публикуйте, что реализация ниже будет то, что я хотел бы предложить следующее.


Это почти правильно, в том смысле, что вам нужно обработать некоторое значение по умолчанию, если условия не выполняются:

DD detail = container.stream().findFirst().orElse(null); // or some default value instead of 'null'

Если container сам по себе может быть нулевым, используйте

DD detail = container != null ? 
                container.stream().findFirst().orElse(null) : null;

В случае, если вам нужен рецепт от этого объекта, используйте map как:

container.stream().findFirst().map(DD::getPrescription).orElse(null)
//                               ^^
//                               return type of prescription then

С Java-9 это могло бы быть намного проще:

A<DD, DI> basePrescription = Stream.ofNullable(container) // Java-9 API
                                   .flatMap(List::stream)
                                   .findFirst()
                                   .map(DD::getPrescription)
                                   .orElse(null);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...