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

Выбросить исключение, если Stream не имеет результата

Мне нужно создать исключение внутри лямбды, и я не знаю, как это сделать.

Вот мой код:

listOfProducts
.stream()
.filter(product -> product.getProductId().equalsIgnoreCase(productId))
.filter(product -> product == null) //like if(product==null) throw exception
.findFirst()
.get()

Я понятия не имею, как это сделать. Есть ли способ сделать это, или я просто обхожу это, применяя фильтр, чтобы фильтр не передавал нулевое значение, например filter(product->product!=null) (даже подсказка будет полезна :))

Редактировать Фактический вопрос: мне нужен продукт, и если он равен нулю, он выдаст исключение, в противном случае он будет пройден, он не упоминается в Лямбда-функция Java 8, которая выдает исключение?

Код, который я пытаюсь реорганизовать,

for(Product product : listOfProducts) {
  if(product!=null && product.getProductId()!=null &&
      product.getProductId().equals(productId)){
    productById = product;
    break;
  }
}
if(productById == null){
  throw new IllegalArgumentException("No products found with the
    product id: "+ productId);
}

У меня есть другое возможное решение, как

public Product getProductById(String productId) {
        Product productById = listOfProducts.stream()
                .filter(product -> product.getProductId().equalsIgnoreCase(productId)).findFirst().get();

        if (productById == null)
            throw new IllegalArgumentException("product with id " + productId + " not found!");

        return productById;
    }

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

...getProductById()
return stream...get();

и если мне нужно объявить собственный метод для объявления исключения, это не будет проблемой


  • Ну, вам нужно фактическое исключение, то есть вы хотите получать предупреждения, когда есть продукт с нулевым значением product, или вы хотите игнорировать продукты с таким значением? 05.09.2016
  • Возможный дубликат функции Java 8 Lambda, которая выдает исключение? 05.09.2016
  • на самом деле filter(product->product!=null) не позволит передать нулевое значение и, следовательно, может привести к сбою, и поэтому да, я хочу получать уведомления 05.09.2016
  • Если возможно, вы должны использовать ifPresent, а не get на Optional, или вы можете использовать orElseThrow 05.09.2016

Ответы:


1

findFirst() возвращает Optional, поэтому, если вы хотите чтобы ваш код выдавал исключение, если вы ничего не нашли, вы должны использовать orElseThrow, чтобы выбросить его.

listOfProducts
.stream()
.filter(product -> product.getProductId().equalsIgnoreCase(productId))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("No products found with the  product id: "+ productId));
05.09.2016
  • @HelloWorld: просто примечание: ваш исходный код пропускает элементы null и завершится ошибкой только в том случае, если нет соответствующего элемента (не null), тогда как этот код немедленно завершится ошибкой, если перед совпадением встретит значение null. Вы должны решить, должны ли null быть разрешены в listOfProducts или нет. 05.09.2016
  • @Holger Действительно, я удалил фильтр нулевой проверки, поскольку в комментарии указывалось, что он предназначен для создания исключения. Однако непотоковой код также имел эту нулевую проверку, но тогда потоковая версия должна иметь ее перед фильтром идентификатора продукта, иначе последний выдаст NPE. 05.09.2016
  • Я добавил это в окончательный результат listOfProducts.stream() .filter(product -> product.getProductId().equalsIgnoreCase(productId)) .filter(product -> product != null).findFirst() .orElseThrow(() -> new IllegalArgumentException("product not found " + productId)); надеюсь, что это заблокирует нулевое значение 05.09.2016
  • @Holger, он проверит значение null, и я не думаю, что мне нужно здесь создавать исключение :) 05.09.2016
  • @HelloWorld: вы должны применить фильтр null перед другим, иначе попытка вызвать product.getProductId() уже вызовет NullPointerException, если поток встретит null. 05.09.2016
  • Didier L, мой вопрос: если listOfProducts пуст, я хочу создать исключение, говоря, что список продуктов пуст, как мы можем это сделать. 11.12.2017
  • @VijenderKumar хорошо, просто проверьте, пуст ли список, а затем выдайте свое исключение ... Если вам нужна более сложная задача, я предлагаю найти другой похожий вопрос, а затем задать свой собственный, если необходимо, с подробностями того, что вы пробовали. 11.12.2017
  • Новые материалы

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

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

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

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

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

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

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