Υπάρχει κάποιος τρόπος αρχικοποίησης ενός Java HashMap με αυτόν τον τρόπο;:
Map<String,String> test =
new HashMap<String, String>{"test":"test","test":"test"};
Ποια θα ήταν η σωστή σύνταξη; Δεν έχω βρει τίποτα σχετικά με αυτό. Είναι αυτό δυνατό; Ψάχνω τον συντομότερο/γρηγορότερο τρόπο για να βάλω κάποιες "τελικές/στατικές" τιμές σε ένα χάρτη που δεν αλλάζουν ποτέ και είναι γνωστές εκ των προτέρων κατά τη δημιουργία του χάρτη.
Java: Ναι, αυτό είναι δυνατό τώρα. Στη Java 9 έχουν προστεθεί μερικές εργοστασιακές μέθοδοι που απλοποιούν τη δημιουργία χαρτών :
// this works for up to 10 elements:
Map<String, String> test1 = Map.of(
"a", "b",
"c", "d"
);
// this works for any number of elements:
Map<String, String> test2 = Map.ofEntries(
entry("a", "b"),
entry("c", "d")
);
Στο παραπάνω παράδειγμα τόσο το test
όσο και το test2
θα είναι τα ίδια, απλά με διαφορετικούς τρόπους έκφρασης του Map. Η μέθοδος Map.of
ορίζεται για μέχρι δέκα στοιχεία στο χάρτη, ενώ η μέθοδος Map.ofEntries
δεν θα έχει τέτοιο όριο.
Σημειώστε ότι σε αυτή την περίπτωση ο χάρτης που θα προκύψει θα είναι ένας αμετάβλητος χάρτης. Αν θέλετε ο χάρτης να είναι μεταβλητός, θα μπορούσατε να τον αντιγράψετε ξανά, π.χ. χρησιμοποιώντας mutableMap = new HashMap<>(Map.of("a", "b"));
(Βλέπε επίσης JEP 269 και το Javadoc)
Όχι, θα πρέπει να προσθέσετε όλα τα στοιχεία χειροκίνητα. Μπορείτε να χρησιμοποιήσετε έναν αρχικοποιητή σε μια ανώνυμη υποκλάση για να κάνετε τη σύνταξη λίγο πιο σύντομη:
Map<String, String> myMap = new HashMap<>() {{
put("a", "b");
put("c", "d");
}};
Ωστόσο, η ανώνυμη υποκλάση μπορεί να εισάγει ανεπιθύμητη συμπεριφορά σε ορισμένες περιπτώσεις. Αυτό περιλαμβάνει για παράδειγμα:
Η χρήση μιας συνάρτησης για την αρχικοποίηση θα σας επιτρέψει επίσης να δημιουργήσετε έναν χάρτη σε έναν αρχικοποιητή, αλλά αποφεύγονται δυσάρεστες παρενέργειες:
Map<String, String> myMap = createMap();
private static Map<String, String> createMap() {
Map<String,String> myMap = new HashMap<String,String>();
myMap.put("a", "b");
myMap.put("c", "d");
return myMap;
}
Αυτός είναι ένας τρόπος.
HashMap<String, String> h = new HashMap<String, String>() {{
put("a","b");
}};
Ωστόσο, θα πρέπει να είστε προσεκτικοί και να βεβαιωθείτε ότι έχετε κατανοήσει τον παραπάνω κώδικα (δημιουργεί μια νέα κλάση που κληρονομεί από το HashMap). Επομένως, θα πρέπει να διαβάσετε περισσότερα εδώ: http://www.c2.com/cgi/wiki?DoubleBraceInitialization , ή απλά να χρησιμοποιήσετε την Guava:
Map<String, Integer> left = ImmutableMap.of("a", 1, "b", 2, "c", 3);
Map<String,String> test = new HashMap<String, String>()
{
{
put(key1, value1);
put(key2, value2);
}
};