Background
With introduction of functional interfaces and Lambda expressions there are some new APIs introduced in collection class. In this post we will look at those.
Conditional removal [Collection.removeIf]
There is a new method added in Collection interface as -
- boolean removeIf(Predicate<? super E> filter)
This basically removes elements from the list that match the predicate. No magic here if you see the default implementation it is as follows -
default boolean removeIf(Predicate<? super E> filter) {
Objects.requireNonNull(filter);
boolean removed = false;
final Iterator<E> each = iterator();
while (each.hasNext()) {
if (filter.test(each.next())) {
each.remove();
removed = true;
}
}
return removed;
}
So you basically iterate on your collection using a iterator and remove all elements that match your predicate condition.
Let's see an example now -
List<String> countriesList = new ArrayList<>();
countriesList.add("India");
countriesList.add("Srilanka");
countriesList.add("Nepal");
countriesList.add("Italy");
countriesList.add("Bhutan");
countriesList.add("Ireland");
System.out.println("Before : " + countriesList);
countriesList.removeIf(s -> s.startsWith("I"));
System.out.println("After : " + countriesList);
Output is :
Before : [India, Srilanka, Nepal, Italy, Bhutan, Ireland]
After : [Srilanka, Nepal, Bhutan]
After : [Srilanka, Nepal, Bhutan]
As you can see all Strings in the list starting with 'I' are removed as defined by the predicate.
and the output is :
Before : [India, Srilanka, Nepal, Italy, Bhutan, Ireland]
After : [Miss India, Miss Srilanka, Miss Nepal, Miss Italy, Miss Bhutan, Miss Ireland]
NOTE : Recollect UnaryOperator takes a single argument of type t and returns a value of same type t. If you wish to recollect common functional interfaces check out the links in the Related links section below.
and the output is -
Before : [India, Srilanka, Nepal, Italy, Bhutan, Ireland]
India
Srilanka
Nepal
Italy
Bhutan
Ireland
After : [India, Srilanka, Nepal, Italy, Bhutan, Ireland]
NOTE : Careful. Do not alter the List with the action or you will get - java.util.ConcurrentModificationException
NOTE : Above method reference System.out::println is same as saying s -> System.out.println(s)
It's method is as follows -
Updating all elements(List.replaceAll)
Another method that is introduced is -
- void replaceAll(UnaryOperator<E> o)
List<String> countriesList = new ArrayList<>();
countriesList.add("India");
countriesList.add("Srilanka");
countriesList.add("Nepal");
countriesList.add("Italy");
countriesList.add("Bhutan");
countriesList.add("Ireland");
System.out.println("Before : " + countriesList);
countriesList.replaceAll(s -> "Miss " + s);
System.out.println("After : " + countriesList);
and the output is :
Before : [India, Srilanka, Nepal, Italy, Bhutan, Ireland]
After : [Miss India, Miss Srilanka, Miss Nepal, Miss Italy, Miss Bhutan, Miss Ireland]
NOTE : Recollect UnaryOperator takes a single argument of type t and returns a value of same type t. If you wish to recollect common functional interfaces check out the links in the Related links section below.
Iterating over a List (List.forEach)
Another useful method that is added in List is -
- public void forEach(Consumer<? super E> action)
List<String> countriesList = new ArrayList<>();
countriesList.add("India");
countriesList.add("Srilanka");
countriesList.add("Nepal");
countriesList.add("Italy");
countriesList.add("Bhutan");
countriesList.add("Ireland");
System.out.println("Before : " + countriesList);
countriesList.forEach(System.out::println);
System.out.println("After : " + countriesList);
and the output is -
Before : [India, Srilanka, Nepal, Italy, Bhutan, Ireland]
India
Srilanka
Nepal
Italy
Bhutan
Ireland
After : [India, Srilanka, Nepal, Italy, Bhutan, Ireland]
NOTE : Careful. Do not alter the List with the action or you will get - java.util.ConcurrentModificationException
NOTE : Above method reference System.out::println is same as saying s -> System.out.println(s)
New APIs added in Map
New APIs added -
- merge()
- putIfAbsent() : puts in map is key is not present or the value is null
- computeIfPresent() : calls the BiFunction when the requested key is found
- computeIfAbsent() : calls the BiFunction when the key isn’t present or
is null
It's method is as follows -
default V merge(K key, V value,
BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
Objects.requireNonNull(remappingFunction);
Objects.requireNonNull(value);
V oldValue = get(key);
V newValue = (oldValue == null) ? value :
remappingFunction.apply(oldValue, value);
if(newValue == null) {
remove(key);
} else {
put(key, newValue);
}
return newValue;
}
Above is the default implementation in Map method. Quick observation :
- If old value is null, bifunction is never called.
- If mapping function returns null key is removed from the Map.
- default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)
- default V computeIfPresent(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)
