当前位置: 首页 > 知识库问答 >
问题:

如何在一个流中遍历列表和枚举值?

常心水
2023-03-14

我有一个列表,我想知道它是否包含除枚举类中的元素以外的任何其他元素。

我有这个工作:

boolean containsMyEnumCode(List<String> processCodes) {
    if (null != processCodes) {
        for (final String process : processCodes) {
            if (!(Arrays.stream(MyEnumCode.values()).anyMatch((p) -> p.name().equals(process)))) {
                return true;
            }
        }
    }
    return false;
}

这是可行的,但是我如何用流替换for循环,并且使它在更少的行中呢?

共有2个答案

柳宪
2023-03-14

您可以使用Stream,而不是nullcheck。ofNullable()(从Java 9开始提供),它将使用单个元素(处理器列表)或空流创建流。然后应用flatMap()将is转换为字符串流。然后将anyMatch()应用为终端操作,因为您正在寻找与给定谓词匹配的单个进程。

请注意,条件!rrays.stream(). anyMatch()意味着流中的任何元素都不应该与传递给anyMatch()的谓词匹配。这就是操作noneMath()的含义。

boolean containsMyEnumCode(List<String> processCodes) {
    return Stream.ofNullable(processCodes)
            .flatMap(List::stream)
            .anyMatch(process -> Arrays.stream(MyEnumCode.values())
                                        .noneMatch((p) -> p.name().equals(process)));
}

这是Java 8的版本:

boolean containsMyEnumCode(List<String> processCodes) {
    if (processCodes == null) {
        return false;
    }
    
    return processCodes.stream()
            .anyMatch(process -> Arrays.stream(MyEnumCode.values())
                                        .noneMatch((p) -> p.name().equals(process)));
}
简宏义
2023-03-14

从作为参数传递的集合上的Optional.ofNullable开始,您可以这样做:

 Optional.ofNullable(processCodes).stream()
                .flatMap(Collection::stream)
                .anyMatch(code -> Arrays.stream(MyEnumCode.values()).anyMatch(v -> v.name().equals(code)));
 类似资料:
  • 我的Flutter项目中有一个Dart枚举,如下所示: 如果我有一些随机枚举状态,如,我如何迭代到下一个枚举(而不需要做一些事情,如用开关语句映射它们)? 我在这个,这个和这个的帮助下找到了答案,所以我把它贴在下面。

  • 我有一个简单的枚举,我想迭代一下。为此,我采用了顺序和迭代器协议,如下面的代码所示。顺便说一句,这可以复制/粘贴到Xcode 8中的游乐场。 但是for in循环生成错误消息“Type”节。Type不符合协议“Sequence”。协议一致性在我的扩展中;那么,这个代码有什么问题? 我知道还有其他方法可以做到这一点,但我想知道这种方法有什么问题。 谢谢

  • 问题内容: 我有一个如下的JavaScript对象: 现在我想通过所有回路元素(,,…),并得到他们的键和值。我怎样才能做到这一点? 我可以根据需要修改JavaScript对象。我的最终目标是遍历一些键值对,如果可能的话,我想避免使用。 问题答案: 您可以使用其他人所示的循环。但是,您还必须确保获得的键是对象的实际属性,而不是来自原型。 这是代码段: 用Object.keys()替代: 请注意,使

  • 问题内容: 我有以下对象和地图: 我想将地图转换成另一个地图。结果图的键是输入图的键。结果映射的值是My对象的属性“名称”,按优先级排序。 该 排序 和提取的名字是没有问题的,但我不能把它放到结果地图。我使用旧的Java 7方法进行操作,但是可以使用流API会很好。 有人知道吗?我试过了,但是被卡住了: 问题答案: 本质上,您将流式传输每个条目集并将其收集到新映射中。要计算新地图中的值,请从旧地图

  • 问题内容: 我有一个这样的清单清单。 现在,我需要遍历上面的列表并输出一个字符串列表,如下所示(原始列表中没有数字) 问题答案: 准确执行您指定的操作的最简单解决方案是: 这基本上等效于迭代版本: 但是,这并不是遍历具有任意维数的多维列表的通用方法,因为嵌套列表推导/嵌套的for循环可能很难看。但是,对于2或3维列表,您应该放心。 如果您确实决定需要平整3个以上的尺寸,我建议实现一个递归遍历函数,

  • 问题内容: 以下代码不起作用,因为Freemarker似乎将[]中的表达式的值强制转换为String,然后将其用作键,这并不是实际期望的值。 准备模板模型: my.ftl: 在Freemarker文档中,描述了如何访问Enum本身,但是我没有找到有关如何使用Enum作为键从哈希中获取值的任何信息。 谢谢。 问题答案: 要对此释义Freemarker文档常见问题, 您不能在myMap [key]表达