如何用Java 8 Stream API遍历枚举值及提取枚举cspId列表
嘿,这两个问题都挺常见的,我来一步步给你讲清楚怎么用Java Stream来处理枚举~
问题1:如何使用Java 8 Stream API遍历枚举值?
枚举类型自带一个values()方法,会返回该枚举所有实例组成的数组。我们只需要把这个数组转换成Stream,就能用Stream的各种操作来遍历啦。
举个例子,遍历Board枚举的所有值并打印它们的id和名称:
// 把枚举数组转成Stream Arrays.stream(Board.values()) .forEach(board -> System.out.printf("ID: %d, Name: %s%n", board.getId(), board.getName()));
如果只是需要简单遍历执行操作,forEach就足够了;要是还需要做过滤、映射等其他操作,也可以在forEach之前添加对应的Stream方法。
问题2:如何使用Java Stream API从枚举列表中仅提取cspId并转换为Integer类型列表?
针对你给出的示例代码,我们可以直接对numbers这个枚举列表调用stream()方法,然后通过map操作提取每个枚举实例的cspId(因为getId()返回的是int,Java会自动装箱成Integer),最后用collect把结果收集成List<Integer>。
修改后的代码如下:
import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public class Test { public static void main(String args[]){ List<Board> numbers=new ArrayList<>(); numbers.add(Board.MY_BOARD); numbers.add(Board.TEST_BOARD); // 用Stream提取cspId并转为Integer列表 List<Integer> list = numbers.stream() .map(Board::getId) // 提取每个Board的id .collect(Collectors.toList()); // 收集成List<Integer> System.out.println(list); // 输出 [0, 2] } } enum Board{ MY_BOARD(0, "My Dashboard"), WEB_BOARD(1, "web Dashboard"), TEST_BOARD(2, "web Dashboard") ; private int cspId; private String name; Board(int id, String name) { this.cspId = id; this.name = name; } public int getId() { return cspId; } public String getName() { return name; } }
这里用到了方法引用Board::getId来简化lambda表达式,看起来更简洁。如果你的项目里用的是Java 16+,还可以用Collectors.toList()的替代写法Stream.toList(),不过上面的写法在Java 8及以上都能正常运行。
对了,如果你是想直接遍历枚举的所有值来提取id,而不是用手动创建的numbers列表,那也可以结合问题1的写法:
List<Integer> allBoardIds = Arrays.stream(Board.values()) .map(Board::getId) .collect(Collectors.toList());
内容的提问来源于stack exchange,提问作者madhusudhan
相关产品推荐
相关产品推荐

