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