添加HashMap而不是使用switch-case?

时间:2015-03-27 13:22:10

标签: java hashmap

所以我有一个Java类,它有许多切换案例,我现在想用HashMap替换,因为它具有更好的性能。所以早些时候我的转换案例就像:

SomeClass someMethod =  new SomeClass();

  if (!("".equals(varA))) {
                switch (varA) {
                case "3":
                    someMethod.setValue("abcd");
                    break;
                case "91":
                    someMethod.setValue("defgh");
                    break;
                        }

现在我想用HashMap替换它。我正在努力在put中添加对象。

HashMap<String, SomeClass> hashMap= new HashMap();
hashMap.put("3", ?????);

我应该在那里写什么,以便我的对象设置值?

3 个答案:

答案 0 :(得分:2)

您可以将callbacks存储为hashmap的值:

public interface MyCallback { 
  public void doSmth( String val ); 
}

...

HashMap<String, MyCallback> hashMap = new HashMap<>();
hashMap.put( "42", new MyCallback(){
  @Override doSmth( String val ){ System.out.println( val ); }
} );

hashMap.get( "42" ).doSmth( "ultimate question" );

答案 1 :(得分:1)

在明显的切换情况下,您始终使用不同的值调用someMethod.setValue("..."),因此此代码可以执行相同的操作:

private static final Map<String, String> values = new HashMap<String, String>();

// in ctor: Fill values on first class instanciation only
if (values.size() == 0) {
    values.put("3", "abcd");
    values.put("91", "defgh");
}


// later
if (values.containsKey(varA))
    someMethod.setValue(values.get(varA));
else
    // Handle unknown switch case

答案 2 :(得分:0)

针对java 8进行了更新:

Map<String, Consumer<String>> map = new HashMap<>();
map.put("42", s -> System.out.println(s));

map.get( "42" ).accept( "ultimate question" );
//or
Optional.ofNullable(map.get("42")).map(fn -> fn.accept("ultimate answer"));