Hello!

When using removeIf, sometimes it's tempting to refer to the
collection from the predicate. E.g.:

    static List<Integer> select(Collection<Integer> input) {
        List<Integer> result = new LinkedList<>(input);
        result.removeIf(left -> result.stream().noneMatch(right ->
right == left * 2));
        return result;
    }

Here one may assume that every time the predicate returns true, the
collection is updated and the subsequent predicate invocations see the
updated collection. This works for default removeIf implementation,
but doesn't work for optimized ones like ArrayList, so replacing
LinkedList with ArrayList in this weird algorithm produces different
result (e.g. with List.of(1, 4, 2) input). I think that spec should
explicitly say that intermediate updates are not guaranteed to be
visible for predicate. What do you think?

With best regards,
Tagir Valeev

Reply via email to