我想用Java流将ArrayList<String>
转换为Set<ScopeItem>
。
ScopeItem is a enum;
items is an ArrayList<String>;
Set<ScopeItem> scopeItems = items.stream()
.map(scopeString -> ScopeItem.valueOf(scopeString))
.filter(Objects::nonNull)
.collect(Collectors.toSet());
对于不在枚举中的字符串,将引发以下内容:
java.lang.IllegalArgumentException: No enum const...
理想情况下,我想跳过所有不匹配的字符串。
我想也许是使用平面图?有什么想法怎么做?
最佳答案
您可以在map
中放入try-catch来返回null
,而不是抛出异常:
Set<ScopeItem> scopeItems = items.stream()
.map(scopeString ->
{
try
{
return ScopeItem.valueOf(scopeString);
}
catch (IllegalArgumentException e)
{
return null;
}
})
.filter(Objects::nonNull)
.collect(Collectors.toSet());
您还可以预先使用
filter
来检查值数组是否包含要查找的字符串:Set<ScopeItem> scopeItems = items.stream()
.filter(scopeString -> Arrays.stream(ScopeItem.values())
.anyMatch(scopeItem -> scopeItem.name().equals(scopeString)))
.map(ScopeItem::valueOf)
.collect(Collectors.toSet());