In this article we will see another JDK 9 feature to create immutable collections. Till Java 8, If we want to create immutable collections we use to call unmodifiableXXX() methods on java.util.Collections class. For example, To create unmodifiable list, we should write below code.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
jshell> List<String> list = new ArrayList<String>(); | |
list ==> [] | |
jshell> list.add("Smart"); | |
$2 ==> true | |
jshell> list.add("Techie"); | |
$3 ==> true | |
jshell> System.out.println("The list values are: "+ list); | |
The list values are: [Smart, Techie] | |
jshell> // make the list unmodifiable | |
jshell> List<String> immutablelist = Collections.unmodifiableList(list); | |
immutablelist ==> [Smart, Techie] | |
jshell> // try to modify the list | |
jshell> immutablelist.add("Smart_1"); | |
| java.lang.UnsupportedOperationException thrown: | |
| at Collections$UnmodifiableCollection.add (Collections.java:1056) | |
| at (#6:1) | |
jshell> |
The above code is too verbose to create a simple unmodifiable List. As Java is adopting functional programming style Java 9 came up with convenience, more compacted factory methods to create unmodifiable collections with JEP 269. Let us see how that works.
Create Empty List:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
jshell> List immutableList = List.of(); | |
immutableList ==> [] | |
//Add an item to the list | |
jshell> immutableList.add("Smart"); | |
| Warning: | |
| unchecked call to add(E) as a member of the raw type java.util.List | |
| immutableList.add("Smart"); | |
| ^————————^ | |
| java.lang.UnsupportedOperationException thrown: | |
| at ImmutableCollections.uoe (ImmutableCollections.java:70) | |
| at ImmutableCollections$AbstractImmutableList.add (ImmutableCollections.java:76) | |
| at (#2:1) |
Create Non-Empty List:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
jshell> List immutableList = List.of("Smart","Techie"); | |
immutableList ==> [Smart, Techie] | |
jshell> //add an item to the list | |
jshell> immutableList.add("Smart_1"); | |
| Warning: | |
| unchecked call to add(E) as a member of the raw type java.util.List | |
| immutableList.add("Smart_1"); | |
| ^————————–^ | |
| java.lang.UnsupportedOperationException thrown: | |
| at ImmutableCollections.uoe (ImmutableCollections.java:70) | |
| at ImmutableCollections$AbstractImmutableList.add (ImmutableCollections.java:76) | |
| at (#2:1) | |
jshell> |
Create Non-Empty Map:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
jshell> Map immutableMap = Map.of(1,"Smart",2,"Techie"); | |
immutableMap ==> {1=Smart, 2=Techie} | |
//Get item from Map | |
jshell> immutableMap.get(1); | |
$2 ==> "Smart" | |
//Add item to map | |
jshell> immutableMap.put(3,"Smart_1"); | |
| Warning: | |
| unchecked call to put(K,V) as a member of the raw type java.util.Map | |
| immutableMap.put(3,"Smart_1"); | |
| ^—————————^ | |
| java.lang.UnsupportedOperationException thrown: | |
| at ImmutableCollections.uoe (ImmutableCollections.java:70) | |
| at ImmutableCollections$AbstractImmutableMap.put (ImmutableCollections.java:557) | |
| at (#3:1) | |
jshell> |
If you look at the above Java 9 factory method, the code is simple one liner to create immutable collections. In the coming article we will see another Java 9 feature. Till then, Stay Tuned!!!
[…] Convenience Factory Methods to create immutable Collections (plus nice use of the REPL to demo) […]
Map.of takes an array of Object? gross… now more than ever java needs a key:value syntax…
I also felt that. As of now I think Map.of() takes up to ten mappings with Key and Value. We require some thing like Map.of(Key:Value,Key:Value….) . The method should take var args.