第一种方法: List<Integer> displaySortList = annoList.stream() .filter(map -> map.containsKey("DISPLAY_SORT")) .map(map -> (Integer) map.get("DISPLAY_SORT")) .filter(java.util.Objects::nonNull) .collect(Collectors.toList());第二种方法: List<Integer> displaySortList = new ArrayList<>(); for(Map<String, Object> anno : annoList){ displaySortList.add(Integer.parseInt(anno.get("DISPLAY_SORT").toString())); }哪种更好
时间: 2025-03-20 14:15:12 浏览: 38
这两种方法都可以从`annoList`中提取出键名为“DISPLAY_SORT”的值,并将其转换为一个整数列表,但在风格、可读性以及健壮性上存在一些差异。我们逐一分析两者的优缺点。
---
### **第一种方法:流式操作**
```java
List<Integer> displaySortList = annoList.stream()
.filter(map -> map.containsKey("DISPLAY_sort"))
.map(map -> (Integer) map.get("DISPLAY_SORT"))
.filter(java.util.Objects::nonNull)
.collect(Collectors.toList());
```
#### 优点:
1. **简洁明了**:使用 Java Stream API 可以让代码更加紧凑和易读。
2. **链式调用**:每个步骤都清晰表达了一个过滤或转换的过程,便于理解整体逻辑。
3. **空值安全**:通过 `.filter(java.util.Objects::nonNull)` 防止潜在的 `NullPointerException` 异常。
4. **功能强大**:Stream 提供了许多内置工具(如排序、去重等),如果后续需要扩展功能非常容易。
#### 缺点:
1. **学习成本较高**:对于不熟悉 Lambda 表达式和 Stream 的开发者来说,可能会感到难以理解和维护。
2. **性能开销稍高**:由于引入了中间状态(例如迭代器、临时集合等),相比手动循环可能会有一定的性能损耗(但对于小规模数据影响不大)。
---
### **第二种方法:传统遍历**
```java
List<Integer> displaySortList = new ArrayList<>();
for(Map<String, Object> anno : annoList){
displaySortList.add(Integer.parseInt(anno.get("DISPLAY_SORT").toString()));
}
```
#### 优点:
1. **简单直观**:这是最经典的编写方式,易于新手程序员快速掌握并调试。
2. **控制力强**:每一步都能明确看到变量的状态变化,在某些复杂场景下比 Stream 更灵活。
#### 缺点:
1. **缺乏鲁棒性**:未检查是否包含键 `"DISPLAY_SORT"` 或者其对应的值是否为空字符串/非数字形式。这可能导致运行时抛出异常(比如 NullPointer 或 NumberFormat 错误)。
2. **冗长啰嗦**:当需求变得更为复杂时(添加额外条件判断之类的需求增加),该方案会显得越发笨拙难看。
---
### **比较结论**
- 如果追求更高的 **可读性和灵活性** 并且团队成员普遍接受现代 Java 特性的运用,则推荐采用 **第一种方法 - 流式操作**。
- 若目标是为了保持最大兼容度并且希望避免过多依赖较新的语言特性的话可以选择较为传统的做法即 **第二种方法** 。但是务必记得加入足够的边界验证来提升代码质量。
综上所述,虽然两者均能完成任务,但从长远来看还是建议优先考虑利用 Streams 进行处理因为它能够带来更多的好处包括但不限于更好的表达能力及减少错误几率等方面的优势。
---
###
阅读全文
相关推荐



















