Как преобразовать метод ниже во встроенную функцию Java 8?

Мне нужно преобразовать ниже метод java 8 в встроенную функцию. для этого нужна помощь специалиста и объяснение.

@Override
public boolean a(final Collection<DoseDetailMutableDTO> detailModels) {
    for (DoseDetailMutableDTO dd : detailModels) {
         final boolean doseDetailTextScheduled = isDoseDetailTextScheduled(dd, 1);
         if (doseDetailTextScheduled) {
             return true;
         }
    }
    return false;
}

и есть ли какой-нибудь короткий путь, чтобы сделать эту Intel IDE?

Intellij Предоставляет больше возможностей Java 8, чем любая другая IDE. Вобще ctrl space. Даже если это изменит ваш традиционный цикл на лямбда, попробуйте RightClick ->Analyse->Inspect code

soorapadman 21.12.2018 06:42

@manfromnowhere Есть ли какие-либо сравнения того, что ide может или не может делать в отношении функций java 8? Мне очень интересно, откуда взялось это утверждение («Intellij предоставляет больше возможностей java 8, чем любая другая IDE»).

wumpz 21.12.2018 08:59

См. Статью Переход на Java 8.

Andrey 21.12.2018 13:50
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
6
3
835
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете использовать Stream.anyMatch как:

public boolean a(final Collection<DoseDetailMutableDTO> detailModels) {
    return detailModels.stream()
                       .anyMatch(dd -> isDoseDetailTextScheduled(dd, 1));
}

returns true if any elements of the stream match the provided predicate, otherwise false

Редактировать: (из комментариев)

The control to learn for such suggested shortcuts on IntelliJ IDEA is Ctrl+Space or on MacOS can use Alt+Enter as well.

Элемент управления, который следует изучить для таких предлагаемых сочетаний клавиш в IntelliJIDEA, - это Ctrl+Space, или в MacOS также можно использовать Alt+Enter.

Naman 21.12.2018 06:49

Этот комментарий может сопровождаться ответом IMO

soorapadman 21.12.2018 06:56

Проблема здесь в том, что вы предполагаете, что isDoseDetailTextScheduled не имеет побочных эффектов. Чтобы получить такой же порядок работы «для», вам нужно использовать Tim Biegeleisens - solution. То же самое касается параллельного выполнения потока.

wumpz 21.12.2018 08:58

Мы можем попробовать использовать поток здесь:

@Override
public boolean a (final Collection<DoseDetailMutableDTO> detailModels) {
    return detailModels.stream()
               .filter(x -> isDoseDetailTextScheduled(x, 1))
               .findFirst()
               .orElse(false);
}

На самом деле, чтобы сделать ваш метод null безопасным, в случае, если список ввода может быть null, мы можем попробовать следующее:

@Override
public boolean a (final Collection<DoseDetailMutableDTO> detailModels) {
    return Optional.ofNullable(detailModels)
                   .map(Collection::stream)
                   .orElseGet(Stream::empty)
                   .filter(x -> isDoseDetailTextScheduled(x, 1))
                   .findFirst()
                   .orElse(false);
}

первый пример можно упростить до .findFirst().isPresent(), а второй - до return detailModels != null && detailModels.stream().filter(x -> isDoseDetailTextScheduled(x, 1)) .findFirst().isPresent();. следует избегать создания Optional только для проверки того, является ли что-то нулевым или нет, поскольку он требует больше памяти и противоречит основной цели Optional.

Ousmane D. 21.12.2018 09:17

Для этого можно использовать anyMatch. Поскольку второй параметр функции является постоянным, вы можете написать метод, вызывающий isDoseDetailTextScheduled. Думаю, становится еще лаконичнее:

public boolean a(final Collection<DoseDetailMutableDTO> detailModels) {
   return detailModels.stream().anyMatch(this::isDoseDetailTextScheduledOne);
}

public boolean isDoseDetailTextScheduledOne(DoseDetailMutableDTO dto) {
    return isDoseDetailTextScheduled(dto, 1);
}

Другие вопросы по теме