繁体   English   中英

HashMap 的 Java 8 Streams

[英]Java 8 Streams for HashMap

下面是我使用的地图,但是当我运行时,我得到了声纳循环复杂度。 而不是这个 if else if else .. 我想使用 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 (){
        .......
    }
 }

谢谢。

使用 Java 8,您可以进行行为参数化。 这意味着您可以拥有一个具有 2 个属性的类(我们称之为 X) - value(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()

您的if语句优先考虑将用于调用方法的键值,因此除非该优先级顺序是明确定义的,否则可能没有更好的方法来执行您正在执行的操作。

如果您为每个存在的键调用一个方法,情况会有所不同,但else子句确保您只调用键ONE的方法,即使映射中还有一个键TWO和一个键THREE

这是一个关于如何使用flatMap流式传输嵌套Map的示例。

我会将您的输入StringFunction之间的映射放在一个单独的映射中。

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

为什么不这样做呢? 为什么你需要流?

 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));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM