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)
No comments:
Post a Comment