How To Convert Arraylist To Hashmap Or Linkedhashmap Inward Coffee Viii - Example Tutorial
One of the mutual chore inwards Java is to convert a List of object e.g. List<T> into a Map e.g. Map<K, V>, where K is about belongings of the object in addition to V is the actual object. For example, suppose you lot receive got a List<Order> in addition to you lot desire to convert it into a Map e.g. Map<OrderId, Order>, how practise you lot that? Well, the simplest way to accomplish this is iterating over List in addition to add together each chemical factor to the Map past times extracting keys in addition to using the actual chemical factor every bit an object. This is precisely many of us practise it inwards pre-Java 8 globe but JDK 8 has made it fifty-fifty simpler. In Java 8, you lot tin acquire the current from List in addition to so collect all elements into a Map past times using a Collector. The collect() method of Stream shape in addition to java.util.stream.Collectors shape gives you lot ample choices to create upward one's heed which belongings goes into the cardinal in addition to which object goes into the value.
Also, In most cases, you lot convert an ArrayList to HashMap or LinkedHashMap, depending upon the scenario, so the job of converting a List to Map is genuinely same every bit the job of converting an ArrayList to HashMap or LinkedHashMap because ArrayList is a List in addition to HashMap is a Map. I'll demo you lot an instance of this shortly.
Btw, inwards general, when you lot convert a List to a Map, you lot receive got to drib dead along inwards heed about of the nuisances which come upward from the fact that they are ii dissimilar information construction amongst dissimilar properties.
For example, a List is an ordered collection which allows duplicate elements, but Map doesn't provide whatever ordering guarantee in addition to it doesn't allow duplicate keys (see difference betwixt HashMap, TreeMap, in addition to LinkedHasMap for to a greater extent than details.
Similarly, it may live possible that the List you lot are converting into a Map may incorporate about duplicates, which may non live a job inwards the traditional way because when you lot insert an existing cardinal into the Map, it overwrites the quondam value, which would live the same object inwards instance of duplicate.
But, it does pose a job if you lot endeavor to collect duplicate elements from Stream into a Map, without telling Collector how to resolve the necktie (see duplicates.
Enough of theory, now, let's commence coding now.
This code likewise handles whatever duplicate inwards the listing good because it is using the put() method to insert entries which override values inwards instance of duplicate keys but no mistake or exception is thrown.
Map<String, Integer> map = novel HashMap<>();
for(String str: listOfString){
map.put(str, str.length());
}
In this code, I receive got chosen a HashMap but you lot are gratuitous to conduct whatever form of map e.g. LinkedHashMap or TreeMap depending upon your requirement.
You tin fifty-fifty work a ConcurrentHashMap, if you lot desire to, Btw, You should work a LinkedHashMap if you lot desire to save club though.
Map<String, Integer> map8 = listOfString.stream().collect(toMap(s -> sec , sec -> s.length()));
The source declaration of toMap is a cardinal mapper in addition to mo is a value mapper. We are using lambda expression which way transcend chemical factor itself every bit a key (s -> s) in addition to it's length every bit value (s -> s.length), here, s represents the electrical current chemical factor of Stream, which is String, thence nosotros are able to telephone telephone the length() method.
The Lambda is rattling skillful at type inference, you lot tin see method reference because it makes your code cleaner. Lambda is nix but code in addition to if you lot already receive got a method which does the same affair so you lot tin transcend the method reference instead of a lambda expression, every bit shown here.
HashMap<String, Integer> hash = listOfString.stream() .collect(toMap(Function.identity(), String::length, (e1, e2) -> e2, HashMap::new));
You tin meet hither nosotros are passing Function.identity() instead of passing the value itself, but, nosotros are using HashMap, which way the club volition non live guaranteed, See the difference betwixt HashMap in addition to LinkedHashMap for to a greater extent than details.
Converting ArrayList to LinkedHashMap inwards Java 8
LinkedHashMap<String, Integer> linked = listOfString.stream()
.collect(toMap(
Function.identity(),
String::length,
(e1, e2) -> e2,
LinkedHashMap::new));
System.out.println("generated linkedhashmap:" + linked);
}
}
In this case, nosotros are using LinkedHashMap instead of HashMap, which way the club of elements volition live the same every bit inwards List because of LinkedHashMap preserver the insertion order. See The Complete Java MasterClass, ane of the comprehensive Java course of report from Udemy.
So, nosotros receive got a list of String in addition to we'll generate a map of String keys in addition to their length every bit value, sounds interesting right, good it is.
We'll progressively movement from traditional, iterative Java solution to advanced, functional Java 8 solution, starting amongst the lambda expressions in addition to moving to method reference in addition to dealing amongst to a greater extent than practical scenarios similar converting listing amongst duplicate objects in addition to keeping the club of elements intact inwards generated map.
From the output, you lot tin meet that the source generated map has lost the order, inwards listing Ruby comes final but inwards the map, Python came last.
Same is truthful for the mo instance because nosotros are non specifying which type of Map we desire to Collectors, thence it is returning a Map implementation which doesn't provide whatever ordering guarantee (see list contains duplicate elements, Java came twice earlier fourth instance but Map doesn't incorporate duplicate in addition to it didn't throw whatever exception or mistake either because nosotros receive got provided a merge constituent to toMap() method to conduct betwixt duplicate values.
2) Use the static of import characteristic to import static methods of Collectors e.g. toMap(), this volition simplify your code.
3) The toMap(keyExtractor, valueExtractor) doesn't provide whatever guarantee of what form of map it volition return.
4) If your List contains duplicate elements in addition to you lot are using them every bit the cardinal so you lot should work toMap(keyMapper, valueMapper, mergeFunction). The merge constituent used to resolve collisions betwixt values associated amongst the same key, every bit supplied to Map.merge(Object, Object, BiFunction). See Java SE 8 for Really impatient to acquire to a greater extent than nearly merge() constituent of Map interface inwards Java 8.
5) If you lot desire to maintain the club of entries inwards the Map same every bit inwards the master listing so you lot should work the toMap(keyMapper, valueMapper, mergeFunction, mapSupplier) method, where mapSupplier is a constituent which returns a new, empty Map into which the results volition live inserted. You tin render LinkedHashMap::new using constructor reference to collect consequence inwards a LinkedHashMap, which guarantees the insertion order.
6) Replace lambda aspect amongst method reference for brevity in addition to simplified code.
That's all nearly how to convert a List to Map inwards Java 8, especially an ArrayList to HashMap in addition to LinkedHashMap. As I said, it's pretty slowly to practise that using current in addition to collector.
The Collectors, which is a static utility shape similar to Collections, provide several options to collect elements of a current into the dissimilar type of collection in addition to the toMap() method tin live used to collect elements into a Map.
Though this method is overloaded in addition to past times default doesn't guarantee which type of Map it volition render e.g. HashMap, TreeMap, or LinkedHashMap, you lot necessitate to tell him nearly that.
Similarly, you lot likewise receive got to live mindful of ordering in addition to duplicate elements. If you lot desire the club of elements should live the same every bit they are inwards the master listing so you lot should work LinkedHashMap every bit an accumulator to collect mappings. Similarly, work the toMap() version which allows you lot to bargain amongst duplicate keys.
Other Java 8 articles in addition to tutorials you lot may similar to explore
Thanks for reading this article so far. If you lot genuinely similar this tutorial in addition to my tips so delight portion amongst your friends in addition to colleagues. If you lot receive got whatever query or feedback so delight drib me a note.
P.S.- If you lot simply desire to acquire to a greater extent than nearly novel features inwards Java 8 so you lot tin likewise meet this listing of Free Java 8 Courses on FreeCodeCamp. It explains all the of import features of Java 8 similar lambda expressions, streams, functional interfaces, Optional, novel Date Time API in addition to other miscellaneous changes.
Also, In most cases, you lot convert an ArrayList to HashMap or LinkedHashMap, depending upon the scenario, so the job of converting a List to Map is genuinely same every bit the job of converting an ArrayList to HashMap or LinkedHashMap because ArrayList is a List in addition to HashMap is a Map. I'll demo you lot an instance of this shortly.
Btw, inwards general, when you lot convert a List to a Map, you lot receive got to drib dead along inwards heed about of the nuisances which come upward from the fact that they are ii dissimilar information construction amongst dissimilar properties.
For example, a List is an ordered collection which allows duplicate elements, but Map doesn't provide whatever ordering guarantee in addition to it doesn't allow duplicate keys (see difference betwixt HashMap, TreeMap, in addition to LinkedHasMap for to a greater extent than details.
Similarly, it may live possible that the List you lot are converting into a Map may incorporate about duplicates, which may non live a job inwards the traditional way because when you lot insert an existing cardinal into the Map, it overwrites the quondam value, which would live the same object inwards instance of duplicate.
But, it does pose a job if you lot endeavor to collect duplicate elements from Stream into a Map, without telling Collector how to resolve the necktie (see duplicates.
Enough of theory, now, let's commence coding now.
How to convert ArrayList to HashMap earlier Java 8
This is the classic way to convert a listing to Map inwards Java. We are iterating over List using enhanced for loop in addition to inserting String every bit a cardinal into a HashMap in addition to its length every bit a value into HashMap.This code likewise handles whatever duplicate inwards the listing good because it is using the put() method to insert entries which override values inwards instance of duplicate keys but no mistake or exception is thrown.
Map<String, Integer> map = novel HashMap<>();
for(String str: listOfString){
map.put(str, str.length());
}
In this code, I receive got chosen a HashMap but you lot are gratuitous to conduct whatever form of map e.g. LinkedHashMap or TreeMap depending upon your requirement.
You tin fifty-fifty work a ConcurrentHashMap, if you lot desire to, Btw, You should work a LinkedHashMap if you lot desire to save club though.
Converting ArrayList to HashMap inwards Java 8 using a Lambda Expression
This is the modern way of converting a listing to map inwards Java 8. First, it gets the current from the list in addition to so it calls the collect() method to collect all chemical factor using a Collector. We are passing a toMap() method to tell Collector that work Map to collect element.Map<String, Integer> map8 = listOfString.stream().collect(toMap(s -> sec , sec -> s.length()));
The source declaration of toMap is a cardinal mapper in addition to mo is a value mapper. We are using lambda expression which way transcend chemical factor itself every bit a key (s -> s) in addition to it's length every bit value (s -> s.length), here, s represents the electrical current chemical factor of Stream, which is String, thence nosotros are able to telephone telephone the length() method.
The Lambda is rattling skillful at type inference, you lot tin see method reference because it makes your code cleaner. Lambda is nix but code in addition to if you lot already receive got a method which does the same affair so you lot tin transcend the method reference instead of a lambda expression, every bit shown here.
HashMap<String, Integer> hash = listOfString.stream() .collect(toMap(Function.identity(), String::length, (e1, e2) -> e2, HashMap::new));
You tin meet hither nosotros are passing Function.identity() instead of passing the value itself, but, nosotros are using HashMap, which way the club volition non live guaranteed, See the difference betwixt HashMap in addition to LinkedHashMap for to a greater extent than details.
Converting ArrayList to LinkedHashMap inwards Java 8
LinkedHashMap<String, Integer> linked = listOfString.stream()
.collect(toMap(
Function.identity(),
String::length,
(e1, e2) -> e2,
LinkedHashMap::new));
System.out.println("generated linkedhashmap:" + linked);
}
}
In this case, nosotros are using LinkedHashMap instead of HashMap, which way the club of elements volition live the same every bit inwards List because of LinkedHashMap preserver the insertion order. See The Complete Java MasterClass, ane of the comprehensive Java course of report from Udemy.
Java Program to convert List to Map inwards JDK 8
Earlier I wanted to work a user or domain object similar Order or Book to demonstrate this example, but I decided against it inwards favor of String to drib dead along the programme simple. Since almost every Java developer knows nearly String, it makes the programme much to a greater extent than acceptable in addition to focus remains exclusively on Java 8 features.So, nosotros receive got a list of String in addition to we'll generate a map of String keys in addition to their length every bit value, sounds interesting right, good it is.
We'll progressively movement from traditional, iterative Java solution to advanced, functional Java 8 solution, starting amongst the lambda expressions in addition to moving to method reference in addition to dealing amongst to a greater extent than practical scenarios similar converting listing amongst duplicate objects in addition to keeping the club of elements intact inwards generated map.
import static java.util.stream.Collectors.toMap; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.function.Function; /* * Java Program to convert a List to Map inwards Java 8. * We'll convert an ArrayList of String to an HashMap * where cardinal is String in addition to value is their length */ public class Demo { public static void main(String[] args) throws Exception { // an ArrayList of String object List<String> listOfString = new ArrayList<>(); listOfString.add("Java"); listOfString.add("JavaScript"); listOfString.add("Python"); listOfString.add("C++"); listOfString.add("Ruby"); System.out.println("list of string: " + listOfString); // converting ArrayList to HashMap earlier Java 8 Map<String, Integer> map = new HashMap<>(); for (String str : listOfString) { map.put(str, str.length()); } System.out.println("generated map: " + map); // converting List to Map inwards Java 8 using lambda expression Map<String, Integer> map8 = listOfString.stream().collect( toMap(s -> s, sec -> s.length())); System.out.println("generated map: " + map); // using method reference map8 = listOfString.stream().collect( toMap(Function.identity(), String::length)); // convert listing amongst duplicate keys to HashMap listOfString.add("Java"); System.out.println("list of string amongst duplicates: " + listOfString); HashMap<String, Integer> hash = listOfString.stream() .collect( toMap(Function.identity(), String::length, (e1, e2) -> e2, HashMap::new)); System.out.println("generated hashmap:" + hash); // drib dead along the club same every bit master listing piece conversion LinkedHashMap<String, Integer> linked = listOfString.stream().collect( toMap(Function.identity(), String::length, (e1, e2) -> e2, LinkedHashMap::new)); System.out.println("generated linkedhashmap:" + linked); } } Output: listing of string: [Java, JavaScript, Python, C++, Ruby] generated map: {Java=4, C++=3, JavaScript=10, Ruby=4, Python=6} generated map: {Java=4, C++=3, JavaScript=10, Ruby=4, Python=6} listing of string amongst duplicates: [Java, JavaScript, Python, C++, Ruby, Java] generated hashmap:{Java=4, C++=3, JavaScript=10, Ruby=4, Python=6} generated linkedhashmap:{Java=4, JavaScript=10, Python=6, C++=3, Ruby=4}
From the output, you lot tin meet that the source generated map has lost the order, inwards listing Ruby comes final but inwards the map, Python came last.
Same is truthful for the mo instance because nosotros are non specifying which type of Map we desire to Collectors, thence it is returning a Map implementation which doesn't provide whatever ordering guarantee (see list contains duplicate elements, Java came twice earlier fourth instance but Map doesn't incorporate duplicate in addition to it didn't throw whatever exception or mistake either because nosotros receive got provided a merge constituent to toMap() method to conduct betwixt duplicate values.
Important points:
1) You tin work the Function.identity() constituent if you lot are passing the object itself inwards the lambda expression. For example, lambda aspect s -> s tin live replaced amongst Function.identity() call.2) Use the static of import characteristic to import static methods of Collectors e.g. toMap(), this volition simplify your code.
3) The toMap(keyExtractor, valueExtractor) doesn't provide whatever guarantee of what form of map it volition return.
4) If your List contains duplicate elements in addition to you lot are using them every bit the cardinal so you lot should work toMap(keyMapper, valueMapper, mergeFunction). The merge constituent used to resolve collisions betwixt values associated amongst the same key, every bit supplied to Map.merge(Object, Object, BiFunction). See Java SE 8 for Really impatient to acquire to a greater extent than nearly merge() constituent of Map interface inwards Java 8.
5) If you lot desire to maintain the club of entries inwards the Map same every bit inwards the master listing so you lot should work the toMap(keyMapper, valueMapper, mergeFunction, mapSupplier) method, where mapSupplier is a constituent which returns a new, empty Map into which the results volition live inserted. You tin render LinkedHashMap::new using constructor reference to collect consequence inwards a LinkedHashMap, which guarantees the insertion order.
6) Replace lambda aspect amongst method reference for brevity in addition to simplified code.
That's all nearly how to convert a List to Map inwards Java 8, especially an ArrayList to HashMap in addition to LinkedHashMap. As I said, it's pretty slowly to practise that using current in addition to collector.
The Collectors, which is a static utility shape similar to Collections, provide several options to collect elements of a current into the dissimilar type of collection in addition to the toMap() method tin live used to collect elements into a Map.
Though this method is overloaded in addition to past times default doesn't guarantee which type of Map it volition render e.g. HashMap, TreeMap, or LinkedHashMap, you lot necessitate to tell him nearly that.
Similarly, you lot likewise receive got to live mindful of ordering in addition to duplicate elements. If you lot desire the club of elements should live the same every bit they are inwards the master listing so you lot should work LinkedHashMap every bit an accumulator to collect mappings. Similarly, work the toMap() version which allows you lot to bargain amongst duplicate keys.
Other Java 8 articles in addition to tutorials you lot may similar to explore
- Java 8 filter + map + collect example
- How to bring together String inwards Java 8
- 5 Free Online Courses to Learn Java 8 in addition to 9
- How to sort the map past times keys inwards Java 8?
- How to sort HasMap past times values inwards Java 8?
- 10 examples of Optional inwards Java 8?
- How to work the forEach method inwards Java 8
- How to work the filter method inwards Java 8
- 10 Examples of Stream inwards Java 8
- How to sort a Map past times values inwards Java 8
- 5 Course to Master Java 8 Programming
Thanks for reading this article so far. If you lot genuinely similar this tutorial in addition to my tips so delight portion amongst your friends in addition to colleagues. If you lot receive got whatever query or feedback so delight drib me a note.
P.S.- If you lot simply desire to acquire to a greater extent than nearly novel features inwards Java 8 so you lot tin likewise meet this listing of Free Java 8 Courses on FreeCodeCamp. It explains all the of import features of Java 8 similar lambda expressions, streams, functional interfaces, Optional, novel Date Time API in addition to other miscellaneous changes.
0 Response to "How To Convert Arraylist To Hashmap Or Linkedhashmap Inward Coffee Viii - Example Tutorial"
Post a Comment