Конвертировать For-Loop в поток Java - PullRequest
0 голосов
/ 23 мая 2019

Я новичок в Java 8 Streams и в настоящее время пытаюсь преобразовать цикл for в поток Java 8. Могу ли я получить помощь?

for (Subscription sub : sellerSubscriptions) {
    if (orders.get(Product).test(sub)) {
        orderableSubscriptions.add(sub.getId());
    }
}

sellerSubscriptions = List.

orders = Map<String,Predicate<Subscription>>

orderableSubscriptions = Set<String>

1 Ответ

2 голосов
/ 23 мая 2019
  1. Создание Stream из Subscriptions с помощью метода Collection#stream()
  2. Использование метода Stream#filter() для "имитации" оператора if путем фильтрации всех подписок, которые не передают данный предикат.
  3. С помощью метода Stream#map() вы преобразуете свой поток подписок в поток идентификаторов
  4. Наконец, используя Stream#collect(), вы можете собрать поток во все, что захотите. Например. Set

Ваш код может выглядеть следующим образом:

Set<String> ids = sellerSubscriptions.stream() // create a Stream<Subscription>
    .filter(orders.get(Product)::test)         // filter out everthing that doesn't match
    .map(Subscription::getId)                  // only use the ids from now on
    .collect(Collectors.toSet());              // create a new Set from the elements

Некоторые заметки:

  • Subscription::getId (ссылка на метод) функционально равна лямбде sub -> sub.getId()
  • orders.get(Product)::test (также ссылка на метод) извлекает предикат только один раз. Как кажется, один и тот же предикат для всех ваших подписок
    • Хотя не равно sub -> orders.get(Product).test(sub), так как это вызовет orders.get(Product) для каждого элемента
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...