Я застрял на краевом футляре в манипуляциях с потоками java...
Я хочу сформулировать следующее поведение: "Из произвольной корзины фруктов собирайте 20 самых маленьких, кроме самой маленькой груши, потому что мы этого не хотим".
Добавленный бонус: у корзин, возможно, совсем не будет груши.
Примеры:
- Из [Pear 5, Apple 1, Apple 2, Apple 10, Pear 3, Pear 7] мы хотим [Apple 1, Apple 2, Pear 5, Pear 7, Apple 10].
- Из [Apple 4, Apple 7, Pear 8, Pear 2, Pear 3] мы хотим [Pear 3, Apple 4, Apple 7, Pear 8].
До сих пор я на этом этапе:
output = basket.stream()
.sorted(Comparator.comparing(Fruit::getSize))
//.filter(???)
.limit(20)
.collect(fruitCollector);
Это похоже на случай лямбда-фильтра stateful, и я не знаю, как это сделать.
Я не могу использовать локальный firstPear
boolean и установить его на true
после фильтрации первой груши, так как все локальные переменные в лямбда должны быть окончательными.
В худшем случае я могу разделить корзину на две части, груши и груши, отсортировать груши и подобрать их соответственно, если они есть. Это кажется очень неэффективным и уродливым. Есть ли лучший способ?
[Изменить] Сравнение ответов
В ответах, размещенных здесь, было много разнообразия, и большинство из них действительно. Чтобы вернуть сообщество, я собрал небольшую жгутов тестирования, чтобы сравнить производительность этих алгоритмов.
Это сравнение было не таким обширным, как я хотел - прошло уже 3 недели. Он охватывает только использование для последовательной обработки простых элементов. Не стесняйтесь давать тестовую проводку и добавлять больше тестов, больше тестов или вашей собственной реализации.
Мой анализ:
Algorithm | Author | Perf | Comments -------------------------------------------------------------------------------- Indexed removal | Holger | Best | Best overall, somewhat obscure Stateful predicate | pedromss | Best | Do not use for parallel processing Straightforward approach | Misha | Best | Better when few elements match Custom collector | Eugene | Good | Better when all or no element match Comaprator hack w/ dummy | yegodm | Good | - Comparator hack | xenteros | * | Perf sensitive to output size, fails on edge cases.
Я рассмотрел ответ "pedromss", как тот, который мы реализовали в проекте, благодаря его хорошей производительности и возможностям "черного ящика" (управляющий состоянием код находится во внешнем классе, и участники могут сосредоточиться на бизнес-логика).
Обратите внимание, что принятый ответ может быть не лучшим для вас: просмотрите остальные или просмотрите мой проект тестирования, чтобы увидеть для себя.