我试图在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
选项来创建新地图。但是它在流中有流而且更复杂。
如果我通过自己找到解决方案,那么将发布该答案,否则将投票选出最佳解决方案。
答案 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]));