java 8 stream делает Operation1 для первого элемента в категории, затем Operation2 для всех элементов в категории - PullRequest
2 голосов
/ 17 марта 2019

Дан список категорий со списком предметов, содержащихся в категориях

//Just example of structure:
List<Category> categories = getCategories();
List<Item> items = category.getItems();

С помощью API потоковой передачи Java как вы выполняете Operation1 () для первого подэлемента в категории, а затем Operation2 () для всех элементов в категории?

Я хочу сделать это в самом чистом коде. Поэтому я пытаюсь сделать это в одном потоке, или как лучше всего это сделать?

Ответы [ 2 ]

1 голос
/ 17 марта 2019

Если вы настаиваете на этом, это бы сработало:

List<Category> categories = getCategories();

categories.forEach(category -> {
    List<Item> items = category.getItems();
    IntStream.range(0, items.size()).forEach(i -> {
                Item item = items.get(i);
                if (i == 0)
                    operation1(item);
                operation2(item);
            }
    );
});

Однако для общей читабельности я бы настоятельно рекомендовал просто получить первый элемент (если имеется) и выполнить на нем вашу операцию1,и затем перебираем все остальное (будь то поток или нет).

Тем не менее, если бы вы на самом деле не имели списков для начала, но имели бы действительно потоковый и неблокирующий код, есть что сказатьподход.По этой же причине я не добавил .stream() до .forEach над категориями, вы начинаете со списка, с которого начинаете.

0 голосов
/ 17 марта 2019

Нет действительно чистого способа выполнить это, но следующий код должен сделать свое дело. Использование AtomicBoolean для отслеживания того, обработан ли первый элемент или нет

List<Category> categories = getCategories();
List<Item> items = category.getItems();
AtomicBoolean bool = new AtomicBoolean(true);

items.forEach(item -> {
         if (bool.get()) {
             bool.set(false);
             operation1(item);
         }
         operation2(item);
     });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...