Java9 - Collection API examples| new java features

Learn about the Java9 features - Collection API Improvements with examples.

Java9 Collection API Improvements

Java9 added minor API changes to java.util.List, java.util.Map, java.util.Set interfaces.

Added new static factory method - of(collection) and returns unmodified collection - List, Set and Map in iteration order.

This method takes a list of parameters as inputs and returns the unmodified collection of List, Set and Map respectively.

Please see for more information JEP 269🔗: Convenience Factory Methods for Collections.

Different ways to create an unmodified collection in java8?

Before the java9 version, we have many ways to create an Unmodified Collection for a few data items.

The below section contains various ways to create an Unmodified collection with examples. For these examples, using the list as a sample, the same process we can adapt to define and declare Set and Map.

  • Simple Unmodified Collection Creation

It is a tedious task to create an unmodified List, Set, or Map with few elements, and unnecessary objects got created.

First, you need to create a list object, Next constructs objects/elements, assign them with a local variable, add this element by calling add(In case of List) method put in case of Set and Map) many times, Finally, convert the normal list to an Unmodified list.

List<String> list = new ArrayList<>();
list.add("one");
list.add("two");
list = Collections.unmodifiableList(list);

  • Copy Constructor Unmodified Collection Create

This is another way of creating a list using the Arrays.asList method. and convert to List using ArrayList Constructor.

List<String> stringList = Collections.unmodifiableList(
new ArrayList<>(Arrays.asList("one", "two")));
  • Unmodified Collection create using Double Brace syntax

In this example, using anonymous inner classes with instances are created in double braces.

List<String> strList = Collections.unmodifiableList(new ArrayList<>() {{
add("one"); add("two"); add("three");
}});

  • Java8 Unmodified Collection with stream

Convert the array of strings to Stream using Stream.of() method, convert the stream to List using Collectors.toList() method.

List<String> strLists = Collections.unmodifiableList(
Stream.of("one", "two", "three").collect(Collectors.toList()));

With java9, We can easily create an unmodified collection.

We will see in the following examples.

Collection API changes in java9

List and Set have both overloaded of() methods with zero to 10 arguments. Syntax and signature for List and Set are the same.

static <E> List<E> of()
static <E> List<E> of(E e1)
static <E> List<E> of(E e1,E e2)
// ..... so on upto ten parameters
static <E> List<E> of(E... e) // variable arguments
static <E> Set<E> of()
static <E> Set<E> of(E e1)
static <E> Set<E> of(E e1,E e2)
// ..... so on upto ten parameters
static <E> Set<E> of(E... e) // variable arguments

The map has also zero to 10 arguments static method.

static <K,V> Map<K,V> of(K k1, V v1, K k2, V v2, K k3, V v3)

Like List and Set, Map also has a version of the variable arguments method

static <K,V> Map<K,V> ofEntries(Map.Entry<? extends K,? extends V>... entries)

List.of() Factory static method example

It is simple to create a list and the code is short.

It takes three elements like input and return list of size 3. As this method is overloaded with 10 arguments, you can supply up to 10 elements.

If more are required to insert, You can use the variable argument version of a method.

List<String> strList = List.of("one", "two", "three","four");

Set.of() factory static method example

Set. of()method takes three parameters as input and returns an unmodified collection.

Set<String> stringSet = Set.of("set1", "set2", "set3");

This method of() would not allow duplicate elements, duplicates elements throws java.lang.IllegalArgumentException: duplicate element.

Set.of("one", "two", "three", "one");

the output of the above code is

 Exception in thread "main" java.lang.IllegalArgumentException: duplicate element: one
 at java.base/java.util.ImmutableCollections$SetN.(ImmutableCollections.java:463)
 at java.base/java.util.Set.of(Set.java:521)
 at org.cloudhadoop.datetime.LamdaExpressionThisExample.main(LamdaExpressionThisExample.java:41)

Map.of() Factory static method example

This interface has two methods of and ofEntries for creating the collection.

Map<Integer, String> mapDemo = Map.of(1, "one", 2, "two", 3, "three");
 // variable arguments example
Map<String, String> map = Map.ofEntries(
new AbstractMap.SimpleEntry<>("key1", "value1"),
new AbstractMap.SimpleEntry<>("key2", "value2"),
new AbstractMap.SimpleEntry<>("key3", "value3"));

Duplicate keys:

Passing Duplicate keys to Map with of() throws java.lang.IllegalArgumentException: duplicate key exception

Map.of("one", "value1", "one", "value2");

and output:

Exception in thread "main" java.lang.IllegalArgumentException: duplicate key: one
at java.base/java.util.ImmutableCollections$MapN.(ImmutableCollections.java:681)
at java.base/java.util.Map.of(Map.java:1327)
at org.cloudhadoop.datetime.LamdaExpressionThisExample.main(LamdaExpressionThisExample.java:41)

unmodified collection - java.lang.UnsupportedOperationException Exception:

Set<String> strSet = Set.of("one", "two");
strSet.add("three");

Output is

Exception in thread "main" java.lang.UnsupportedOperationException
at java.base/java.util.ImmutableCollections.uoe(ImmutableCollections.java:71)
at java.base/java.util.ImmutableCollections$AbstractImmutableSet.add(ImmutableCollections.java:281)
at org.cloudhadoop.datetime.LamdaExpressionThisExample.main(LamdaExpressionThisExample.java:39)

Unmodified collection Null values not accepted in java9

of method does not accept null values.

Set.of("one", "two", null);
ist.of("one", "two", null);

Output.

Exception in thread "main" java.lang.NullPointerException
at java.base/java.util.Objects.requireNonNull(Objects.java:221)
at java.base/java.util.ImmutableCollections$ListN.(ImmutableCollections.java:234)
at java.base/java.util.List.of(List.java:842)
at org.cloudhadoop.datetime.LamdaExpressionThisExample.main(LamdaExpressionThisExample.java:39)

if Null values passed as either key or value of Map, throws java.lang.UnsupportedOperationException

Set<String> strSet = Set.of("one", "two");
strSet.add("three");

Output:

Exception in thread "main" java.lang.UnsupportedOperationException
at java.base/java.util.ImmutableCollections.uoe(ImmutableCollections.java:71)
at java.base/java.util.ImmutableCollections$AbstractImmutableSet.add(ImmutableCollections.java:281)
at org.cloudhadoop.datetime.LamdaExpressionThisExample.main(LamdaExpressionThisExample.java:39)

Collection Factory static method feature

  • It returns Unmodified Collection
  • if the elements are serialized, the returned collection is also serialized
  • No Null key and values are not allowed in Map
  • Null values are not allowed in List and Set
  • These collections are immutable, Any mutable methods(adding/modifying/deleting elements from a collection) throws UnsupportedOperationException.
  • Duplicates are not allowed and Ordering is unordered in Set
  • The list allows duplicates but the returned collection is based on the original insertion order
  • These static methods Can not be overridden. We can not use them using subclass implementation or an instance type. They can be called using interface names only.

Conclusion

In this tutorial, Learned java9 collection API changes and examples.