下面是我使用的地图,但是当我跑步时,我得到了声纳的数字复杂性。而不是这个if else else if ..我想使用Java 8 Stream。如何用Java 8 Streams写这个...请指教。
Map<String, String> innerMap = new HashMap<String, String>();
innerMap.put("ONE" , "ABC");
innerMap.put("TWO" , "DEF");
innerMap.put("THREE" , "GHI");
Map<String, Map<String,String> outerMap = new HashMap<String, Map<String, String>>();
outerMap.put("OUTER" , innerMap);
if(outerMap.containsKey("OUTER")){
if(innerMap.containsKey("ONE")){
call one method.....
}else if (innerMap.containsKey("TWO")){
call one method....
}else if (){
.......
}
}
感谢。
答案 0 :(得分:1)
使用Java 8,您可以进行行为参数化。这意味着您可以拥有一个类(让我们称之为X),其中包含2个属性 - 值(type = String
),method(type = Function
)
所以,你可以像这样构建Map:
Map<String, X> innerMap = new HashMap<>();
innerMap.put("ONE" , new X("ABC", SomeClass::somemethod));
innerMap.put("TWO" , new X("DEF", SomeClass::somemethod2));
innerMap.put("THREE" , new X("GHI", SomeClass::somemethod3));
然后,您可以迭代地图的entrySet()
,然后只需拨打function.apply()
;
答案 1 :(得分:0)
您的if
语句优先考虑用于调用方法的键值,因此,除非明确定义优先级顺序,否则可能没有更好的方法来执行您正在执行的操作。< / p>
如果您为每个密钥调用一个方法会有所不同,但else
子句确保您只调用密钥ONE
的方法,即使其中有&#39 ; s也是地图中的一个键TWO
和一个键THREE
。
答案 2 :(得分:0)
以下是有关如何使用Map
流式传输嵌套flatMap
的示例。
我会将输入String
和Function
之间的映射放在单独的地图中。
public void withConsumerMap(){
// Create a map of your functions too
Map<String, Consumer<String>> functions = new HashMap<>();
functions.put("ONE", this::one);
Map<String, String> innerMap = new HashMap<>();
innerMap.put("ONE" , "ABC");
innerMap.put("TWO" , "DEF");
innerMap.put("THREE" , "GHI");
Map<String, Map<String,String>> outerMap = new HashMap<>();
outerMap.put("OUTER" , innerMap);
outerMap.entrySet().stream()
.filter(outer -> outer.getKey().equals("OUTER"))
.flatMap(outer -> outer.getValue().entrySet().stream())
.forEach(inner -> functions.get(inner.getKey()).accept(inner.getValue()));
}
public void one(String param){ ... }
在上面的示例中,我使用了java.util.function.Consumer
,它接受一个输入,然后返回void
。如果你需要你的功能来返回一些东西。请改用java.util.function.Function
。
答案 3 :(得分:0)
为什么不这样做呢?为什么你需要这个流?
Map<String, Runnable> executionPath = new HashMap<>();
executionPath.put("OUTER-ONE", runnable1);
executionPath.put("OUTER-TWO", runnable2);
// I guess you want to pass the arg - such as "OUTER-ONE"
executor.execute(executionPath.get(arg));