使用字符串数组作为值创建Hashmap,使用Enum作为Java 8 Lambda-Stream中的Key

时间:2015-10-30 05:48:21

标签: java lambda java-8 java-stream

我试图在Java 8中使用Lambda-Stream实现以下逻辑。(参见下面的示例方法)。我以旧的方式记下逻辑,这样就可以很容易地创建解决方案,而不是我的Lambda版本 - Stream设置,因为没有最终结果而更加复杂和错误。

public static HashMap<EnumObj,String> getHashMapData(String…args){
     int i = 0;
     HashMap<EnumObj,String> hashObj = new HashMap<EnumObj,String>();
     if(args.length <= 6){
           for(String arg : args){
                if(i == 0){
                     hashObj.put(EnumObj.FIRSTNAME,args[i]);
                }else if(i == 1){
                     hashObj.put(EnumObj.LASTNAME,args[i]);
                }else if{……….
                ………….
                }else if(i == 4 && args.length < 5){
                      hashObj.put(EnumObj.COMPANY,args[i]);
                      hashObj.put(EnumObj.COMANYBOSS,args[i+1]);
                }else if(i == 5 && args.length < 6){
                      hashObj.put(EnumObj.COMANYBOSS,args[i]);
                }
           }  
     }
}

如果之前失去了这样的循环逻辑,请忽略if / else的任何错误逻辑。虽然我一直在尝试我的逻辑思想,但是如果其他人已成功完成或有建议以最简单的方式实现它,那就得到一些想法。

到目前为止,我使用两个Stream来实现Collections.toMap选项来创建新地图。但是它在流中有流而且更复杂。

如果我通过自己找到解决方案,那么将发布该答案,否则将投票选出最佳解决方案。

1 个答案:

答案 0 :(得分:1)

正如评论中已经说过的,这段代码不正确。我假设你有一个可变长度的参数数组,并且每个参数对应一个EnumObj的枚举常量。

如果是这样的话,你只需要一个简单的for循环:

Map<EnumObj, String> result = new HashMap<>();
EnumObj[] enums = EnumObj.values();
for (int i = 0; i < args.length; i++) {
    result.put(enums[i], args[i]);
}

你可以对溪流做同样的事,但你不会获得任何收益,IMO:

Map<EnumObj, String> result = new HashMap<>();
EnumObj[] enums = EnumObj.values();
IntStream.range(0, args.length)
         .forEach(i -> result.put(enums[i], args[i]));