【发布时间】:2017-08-06 09:09:20
【问题描述】:
我在玩 Java * Stream API,我在 Lagecy 系统中有以下代码:
Iterator itr = configMap.entrySet().iterator();
List<String> resultList = new ArrayList<String>();
while(itr.hasNext()){
Entry e = (Entry)itr.next();
Config rc = (Config)e.getValue();
if (rc != null && rc.getVisibleTo() != null && (rc.getVisibleTo().equalsIgnoreCase("0010") || rc.getVisibleTo().equalsIgnoreCase("0111") || rc.getVisibleTo().equalsIgnoreCase("0011"))){
resultList .add(rc.getName());
}
}
我写了上面代码的Stream Equivalent如下:
List<String> resultList = configMap.entrySet()
.parallelStream()
.map(r -> r.getValue())
.filter(r -> r.getVisibleTo() != null)
.filter(r -> {return
r.getVisibleTo().equalsIgnoreCase("0010")
|| r.getVisibleTo().equalsIgnoreCase("0111")
|| r.getVisibleTo().equalsIgnoreCase("0011");
})
.map(r -> r.getName())
.collect(Collectors.toList());
两种方式我都得到了想要的结果。我的问题是在这种情况下哪种表现方式更好?如果我选择其中一个而不是另一个,我真的会获得任何价值吗?地图中有大约 1000 个值。
【问题讨论】:
-
这看起来像是基于意见的问题。有人会说a很好。有人会说b好。它可能会在人们之间引起争论并影响本网站。它也可能会让你投反对票(不是来自我)。所以尝试编辑你的问题
-
为了可读性,我会从 .filter(r -> r.getVisibleTo() != null) .filter(r -> {return r.getVisibleTo().equalsIgnoreCase("0010) 创建一个单独的谓词") || r.getVisibleTo().equalsIgnoreCase("0111") || r.getVisibleTo().equalsIgnoreCase("0011"); })
-
我会采用更具可读性的方法(即流方法)
-
我真的很喜欢
equalsIgnoreCase的这种用法。你永远不知道,也许那里有小写的0s 或大写的1s…… -
您最好专注于编写清晰、明显和可维护的代码,而不是关注微观性能问题。在绝大多数情况下,显而易见的代码也足够快。
标签: java-8