split items of batch into multiple categories
Your Collector is reinventing the wheel.  There already exists a collector which partitions the collected items into groups: Collectors.groupingBy, which you could use something like:

.collect(
    Collectors.groupingBy(
        item -&gt; (item.category == CAT_3 || item.category == CAT_4) &amp;&amp; !isValid(item.id)
                     ? CAT_5 : item.category)
    )
)


Of course, this will return a Map&lt;ItemCategory, List&lt;Item&gt;&gt;.  You can transform this back to a list of lists, if needed. 

And of course, you would need to add the CAT_5 to the ItemCategory enum.  Alternately, you could use null at the category 5 key, if you don't mind null as a key value, but be warned that it will make some people's skin crawl.



If the order of the items in the all of the groups (as opposed to just the Category 5 group) does not matter, then groupingByConcurrent will give better parallel stream performance.