W tym wpisie opiszę sposoby iteracji po mapach w formie szybkiej ściągi 🙂
Oczywiście istnieje o wiele więcej sposobów. Można np. użyć Apache Collections. Ja wybrałem te podstawowe mieszczące się w „fabrycznym” API Javy 🙂
Na początku dane wejściowe:
1 2 3 4 5 |
Map<String, Integer> someCollection = new HashMap<>(); someCollection.put("key1", 100); someCollection.put("key2", 200); someCollection.put("key3", 300); someCollection.put("key4", 400); |
Sposób pierwszy: iteracja za pomocą Iteratora i Map.Entry (statycznego interfejsu wewnętrznego interfejsu Map). Poniżej wersja z pętlą while:
1 2 3 4 5 |
Iterator<Map.Entry<String, Integer>> it = someCollection.entrySet().iterator(); while (it.hasNext()) { Map.Entry<String, Integer> pair = it.next(); System.out.println(pair.getKey() + " " + pair.getValue()); } |
Sposób drugi: wersja intercji za pomocą Map.Entry w pętli foreach:
1 2 3 |
for (Map.Entry<String, Integer> pair : someCollection.entrySet()) { System.out.println(pair.getKey() + " " + pair.getValue()); } |
Sposób trzeci: z użyciem pętli foreach przy pomocy lambd:
1 |
someCollection.forEach((k, v) -> System.out.println(k + " " + v)); |
Sposób czwarty: z użyciem metody .keySet()
w pętli foreach:
1 2 3 |
for (String key : someCollection.keySet()) { System.out.println(key + " " + someCollection.get(key)); } |
Sposób piąty: za pomocą metody .keySet().iterator()
z iteratorem
1 2 3 4 5 |
Iterator<String> it = someCollection.keySet().iterator(); while (it.hasNext()) { String key = it.next(); System.out.println(key + someCollection.get(key)); } |
Sposób szósty: za pomocą standardowej pętli for oraz Map.Entry
1 2 3 4 |
for (Iterator<Map.Entry<String, Integer>> entries = someCollection.entrySet().iterator(); entries.hasNext(); ) { Map.Entry<String, Integer> entry = entries.next(); System.out.println(entry.getKey() + " " + entry.getValue()); } |
Sposób siódmy: za pomocą strumieni dany z Javy 8 Stream API
1 |
someCollection.entrySet().stream().forEach(e -> System.out.println(e.getKey() + " " + e.getValue())); |
Sposób ósmy: wersja z Javą 8 i Stream API parallel
1 |
someCollection.entrySet().stream().parallel().forEach(e -> System.out.println(e.getKey() + " " + e.getValue())); |
Poniżej całość kodu w klasie Main:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
public class Main { public static void main(String[] args) { /** dane wejściowe*/ Map<String, Integer> someCollection = new HashMap<>(); someCollection.put("key1", 100); someCollection.put("key2", 200); someCollection.put("key3", 300); someCollection.put("key4", 400); /** sposób pierwszy*/ Iterator<Map.Entry<String, Integer>> it = someCollection.entrySet().iterator(); while (it.hasNext()) { Map.Entry<String, Integer> pair = it.next(); System.out.println(pair.getKey() + " " + pair.getValue()); } /** sposób drugi*/ for (Map.Entry<String, Integer> pair : someCollection.entrySet()) { System.out.println(pair.getKey() + " " + pair.getValue()); } /** sposób trzeci*/ someCollection.forEach((k, v) -> System.out.println(k + " " + v)); /**sposób czwarty*/ for (String key : someCollection.keySet()) { System.out.println(key + " " + someCollection.get(key)); } /**sposób piąty*/ Iterator<String> it2 = someCollection.keySet().iterator(); while (it2.hasNext()) { String key = it2.next(); System.out.println(key + someCollection.get(key)); } /**sposób szósty*/ for (Iterator<Map.Entry<String, Integer>> entries = someCollection.entrySet().iterator(); entries.hasNext(); ) { Map.Entry<String, Integer> entry = entries.next(); System.out.println(entry.getKey() + " " + entry.getValue()); } /** sposób siódmy*/ someCollection.entrySet().stream().forEach(e -> System.out.println(e.getKey() + " " + e.getValue())); /** sposób ósmy*/ someCollection.entrySet().stream().parallel().forEach(e -> System.out.println(e.getKey() + " " + e.getValue())); } } |
Chętnie uzupełnię ten wpis o inne sposoby, które ty znasz lub na co dzień używasz. Daj mi znać w komentarzu, a umieszczę Twoje rozwiązania w tym wpisie 🙂