2015-12-27 4 views
-1

Я хочу создать экземпляр Java-хэш-карты с литералами на Java. Я использую Java 8.Java - экземпляр hashmap из буквенных пар значений

Я видел из функционального программирования в Java книге, что вы можете сделать это с помощью списков:

final List<String> cities = Arrays.asList("Albany", "Boulder", "Chicago", "Denver", "Eugene"); 

Но я не видел, как вы можете сделать нечто подобное с хэш-карт ,

Я могу создать хэш-карту, как это:

import java.util.HashMap; 
import java.util.Map; 

public class ShortestPath1 { 
    public static void main(final String[] args) { 
     final Map<String,Integer> station2nlc = new HashMap<String, Integer>(); 
     station2nlc.put("Ealing Broadway", 319000); 
     station2nlc.put("Ealing Common", 319005); 
     station2nlc.put("Acton Town LT", 50000); 
     station2nlc.put("Chiswick Park LT", 54500); 
     station2nlc.put("Turnham Green LT", 73400); 
     station2nlc.put("Stamford Brook LT", 71300); 
     station2nlc.put("Ravenscourt Park LT", 68200); 
     station2nlc.put("Hammersmith LT", 59300); 
     station2nlc.put("Barons Court LT", 51600); 
     station2nlc.put("West Kensington", 76000); 
     station2nlc.put("Earls Court LT", 56200); 
     station2nlc.put("West Kensington LT", 76000); 

     System.out.println("Ealing has NLC: " + station2nlc.get("Ealing Broadway")); 
    } 
} 

Но этот синтаксис означает, что Java строит HashMap за одну команду линии. Скорее всего, это.

Для сравнения, в приведенном ниже примере в C++ является то, что я думал, был бы возможно:

#include <string> 
#include <unordered_map> 
#include <iostream> 

int main() { 
    std::unordered_map<std::string, int> station2nlc(
    { 
     { "Ealing Broadway", 319000 }, 
     { "Ealing Common", 319005 }, 
     { "Acton Town LT", 50000 }, 
     { "Chiswick Park LT", 54500 }, 
     { "Turnham Green LT", 73400 }, 
     { "Stamford Brook LT", 71300 }, 
     { "Ravenscourt Park LT", 68200 }, 
     { "Hammersmith LT", 59300 }, 
     { "Barons Court LT", 51600 }, 
     { "West Kensington", 76000 }, 
     { "Earls Court LT", 56200 }, 
     { "West Kensington LT", 76000 }, 
    }); 

    std::cout << "Ealing has NLC: " << station2nlc["Ealing Broadway"] << std::endl; 
} 
+0

@ KonstantinosChalkias Я видел этот пост, но был в 2009 году, поэтому я надеялся, что Java8 может добавить к этому лучшую поддержку. –

+1

Лучший ответ по-прежнему остается прежним - используйте один из классов-помощников guava. –

+0

У этого сообщения есть ответы, которые вы ожидаете (Java 8 и Guava) http://stackoverflow.com/questions/507602/how-can-i-initialize-a-static-map#answer-25829097 –

ответ

1

Поскольку вы используете Java-вы можете использовать потоки и коллектор для достижения этой цели.

import java.util.AbstractMap.SimpleEntry; 
import java.util.stream.Collectors; 
import java.util.stream.Stream; 

... 

Map<String, String> map = Stream.of(
       new SimpleEntry<>("key1", "value1"), 
       new SimpleEntry<>("key2", "value2")) 
       .collect(Collectors.toMap(SimpleEntry::getKey, SimpleEntry::getValue)); 

Это довольно многословно, но имеет существенное преимущество по сравнению с статическим методом инициализации - класс, который создает экземпляр карты таким образом, не ссылаются им. В случае статической инициализации анонимный класс, созданный с помощью new HashMap<>(){...}, будет содержать ссылку на класс, который его создал, а последний не может быть мусором, собранным до самой карты.

+0

Является ли SimpleEntry классом, который я определяю? Можете привести пример, пожалуйста. –

+0

@AngusComber Это под AbstractMap, я добавил импорт в свой ответ, чтобы сделать его более простым. –