我想用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());

10-06 05:39