在 Java 8 中迭代枚举

2022-08-31 12:32:56

是否可以使用 Lambda 表达式迭代 ?以下代码片段的 Lambda 表示形式是什么:Enumeration

Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces();

while (nets.hasMoreElements()) {
    NetworkInterface networkInterface = nets.nextElement();

}

我没有在其中找到任何流。


答案 1

(此答案显示了许多选项之一。仅仅因为已经有了接受标志,并不意味着它是最好的一个。我建议阅读其他答案,并根据您所处的情况选择一个。国际 海事 组织:


您可以使用 Collections.list 将元素从枚举复制到 ArrayList,然后像这样使用它

Collections.list(yourEnumeration).forEach(yourAction);

答案 2

如果代码中有很多枚举,我建议创建一个静态帮助器方法,将枚举转换为。静态方法可能如下所示:

public static <T> Stream<T> enumerationAsStream(Enumeration<T> e) {
    return StreamSupport.stream(
        Spliterators.spliteratorUnknownSize(
            new Iterator<T>() {
                public T next() {
                    return e.nextElement();
                }
                public boolean hasNext() {
                    return e.hasMoreElements();
                }
            },
            Spliterator.ORDERED), false);
}

将该方法与静态导入结合使用。与 Holger 的解决方案相比,您可以从不同的操作中受益,这可能会使现有代码更加简单。下面是一个示例:

Map<...> map = enumerationAsStream(enumeration)
    .filter(Objects::nonNull)
    .collect(groupingBy(...));