I need to split the list into two lists according to the predicate with the limiting elements that go into the truepart.
For instance. Let's say I have a list like this: A = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]and I want to split it into a predicate o -> o % 2 == 0and with a limit 3.
I want to get Map<Boolean, List<Integer>>where:
true -> [2, 4, 6] // objects by predicate and with limit (actually, order is not important)
false -> [1, 3, 5, 7, 8, 9, 10] // All other objects
Java 8 has a collector that splits a stream by a predicate - Collectors.partitioningBy(...)but it does not support restrictions. Can this be done using java 8 streams / guava / apache, or do I need to create my own implementation of this function?
EDIT: I wrote this function. If you have any suggestions about this, feel free to tell me. MultiValuedMap is optional and can be replaced with Map.
private <E> MultiValuedMap<Boolean, E> partitioningByWithLimit(Predicate<E> predicate, List<E> src, int limit) {
MultiValuedMap<Boolean, E> result = new ArrayListValuedHashMap<>();
Iterator<E> iterator = src.iterator();
while (iterator.hasNext()) {
E next = iterator.next();
if (limit > 0 && predicate.test(next)) {
result.put(true, next);
iterator.remove();
limit--;
}
}
result.putAll(false, src);
return result;
}