Nano Hash - криптовалюты, майнинг, программирование

Java 8: потоковая передача и фильтрация на основе дополнительных условий

Пример. Отфильтруйте список продуктов, у которых есть цена на основе значений fromPrice и toPrice. Они могут поставляться либо оба, либо только один.

  1. Найти все товары, цена которых больше fromPrice
  2. Найти все товары, цена которых меньше toPrice
  3. Найти все товары, цена которых находится между fromPrice и toPrice

Товар:

public class Product {

    private String id;

    private Optional<BigDecimal> price;

    public Product(String id, BigDecimal price) {
        this.id = id;
        this.price = Optional.ofNullable(price);
    }
}

Предикат цены:

public class PricePredicate {

    public static Predicate<? super Product> isBetween(BigDecimal fromPrice, BigDecimal toPrice) {
        if (fromPrice != null && toPrice != null) {
            return product -> product.getPrice().isPresent() && product.getPrice().get().compareTo(fromPrice) >= 0 &&
                    product.getPrice().get().compareTo(toPrice) <= 0;
        }
        if (fromPrice != null) {
            return product -> product.getPrice().isPresent() && product.getPrice().get().compareTo(fromPrice) >= 0;
        }
        if (toPrice != null) {
            return product -> product.getPrice().isPresent() && product.getPrice().get().compareTo(toPrice) <= 0;
        }
        return null;
    }
}

Фильтры:

return this.products.stream().filter(PricePredicate.isBetween(fromPrice, null)).collect(Collectors.toList());

return this.products.stream().filter(PricePredicate.isBetween(null, toPrice)).collect(Collectors.toList());

return this.products.stream().filter(PricePredicate.isBetween(fromPrice, toPrice)).collect(Collectors.toList());

Есть ли способ улучшить мой предикат вместо проверки if not null? Что-нибудь, что можно сделать с опционами?


Ответы:


1

Нет, необязательный не предназначен для замены нулевых проверок.

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

public static Predicate<Product> isBetween(BigDecimal fromPrice, BigDecimal toPrice) {
    Predicate<Product> result = product -> true;

    if (fromPrice != null) {
        result = result.and(product -> product.getPrice().isPresent() && product.getPrice().get().compareTo(fromPrice) >= 0);
    }

    if (toPrice != null) {
        result = result.and(product -> product.getPrice().isPresent() && product.getPrice().get().compareTo(toPrice) <= 0);
    }

    return result;
}
14.07.2017
  • Первого предложения достаточно, чтобы получить от меня +1. 14.07.2017
  • Спасибо . Это выглядит хорошо. но здесь я получаю ошибку компиляции: Необязательный‹BigDecimal› price = product.getPrice(); не может разрешить символ "продукт" 14.07.2017
  • О да, извините, мой код не имеет смысла. Позвольте мне исправить это. 14.07.2017
  • Спасибо. Это в значительной степени то, что я сделал. 14.07.2017
  • Я бы подумал, должно ли присутствие цены всегда быть обязательным (случай, когда from и to равны null, в любом случае является краеугольным камнем). Таким образом, вы можете заменить product -> true на product -> product.getPrice().isPresent() и удалить product.getPrice().isPresent() && из других предикатов. 14.07.2017
  • @ Хольгер согласился. 14.07.2017

  • 2

    Вы можете использовать Apache Commons Lang, он предлагает нулевое безопасное сравнение:

    ObjectUtils.compare(from, to)
    

    null is assumed to be less than a non-value

    14.07.2017
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..