Optional orElseGet 返回一个空的List<String>
时间: 2024-09-28 16:06:20 浏览: 81
在Java 8中,`Optional` 是一种容器对象,它可能包含或者不包含非null值。当你有一个不确定是否存在的结果,并且想要提供一个默认值(比如空的List)时,可以使用 `orElseGet` 方法。
`orElseGet` 接受一个函数作为参数,该函数会在 `Optional` 对象本身为空时被调用,返回一个新的对象。如果 `Optional` 包含值,则不执行提供的函数。例如,如果你希望得到一个空的 `List<String>` 作为默认,你可以这样做:
```java
Optional<List<String>> optionalList = CacheUtil.getData(...); // 这里假设getData返回的是一个Optional<String[]>
optionalList.orElseGet(() -> Collections.emptyList()); // 如果optionalList为空,会返回一个空的List
```
这里,如果 `CacheUtil.getData(...)` 返回的不是一个 `String[]` 的实例,那么 `Collections.emptyList()` 就会被用于创建一个新的空列表。
如果 `optionalList` 已经有值(即不是一个空的Optional),则不会执行 `orElseGet` 中的函数,直接返回已有的列表。
相关问题
sndList = ((List<String>) CacheUtil.getData(...)); 提示类型的安全性:从Object到List<String>的未检查 应该如何修正?
这个代码片段在将 `CacheUtil.getData(...)` 返回的结果强制转换为 `List<String>` 时,存在类型安全性问题,因为它没有通过类型检查就进行了隐式转换,这可能导致运行时错误,特别是当 `getData(...)` 返回的实际上是 `null` 或者不是预期的 `List<String>` 类型时。
为了提高代码的类型安全性和可读性,你可以采取以下几种修正方法:
1. **使用静态类型检查**(Optional.ofNullable 和 Optional.map):
```java
List<String> sndList = Optional.ofNullable(CacheUtil.getData(...))
.map(String::valueOf)
.filter(Objects::nonNull)
.orElseGet(Collections::emptyList);
```
2. **使用泛型和断言**:
```java
@SafeVarargs
public static <T> List<T> getDataAndConvert(Class<T> clazz) {
List<?> rawData = CacheUtil.getData(...);
List<T> typedList = (List<T>) rawData;
Assert.isTrue(typedList.stream().allMatch(clazz::isInstance), "Invalid data type");
return typedList;
}
List<String> sndList = getDataAndConvert(String.class);
```
3. **使用ClassCastException处理**:
```java
List<String> sndList;
try {
sndList = (List<String>) CacheUtil.getData(...);
} catch (ClassCastException e) {
throw new RuntimeException("Invalid data type", e);
}
```
每种方法都有其优缺点,选择哪种取决于你的项目需求、团队规范以及对潜在错误的容忍度。
优化这段代码:private List<DynamicSource> getDynamicSourceList(List<DasymesQltyMpCertfInfoItemMod> itemModList) { List<Map<String, String>> mapList = new ArrayList<>(); if (itemModList == null || itemModList.size() == 0) { Map<String, String> map = new HashMap<>(); map.put("no", null); map.put("name", null); map.put("portion", null); mapList.add(map); return DynamicSource.createList("detail", mapList); } for (int i = 1; i <= itemModList.size(); i++) { DasymesQltyMpCertfInfoItemMod item = itemModList.get(i - 1); Map<String, String> map = new HashMap<>(); map.put("no", i + ""); map.put("name", item.getItemName()); map.put("portion", item.getPortion()); mapList.add(map); } return DynamicSource.createList("detail", mapList); }
可以使用Java 8的Stream API来重写这段代码,代码如下:
```
private List<DynamicSource> getDynamicSourceList(List<DasymesQltyMpCertfInfoItemMod> itemModList) {
List<Map<String, String>> mapList = Optional.ofNullable(itemModList)
.orElseGet(Collections::emptyList)
.stream()
.map(item -> {
Map<String, String> map = new HashMap<>();
map.put("no", String.valueOf(itemModList.indexOf(item) + 1));
map.put("name", item.getItemName());
map.put("portion", item.getPortion());
return map;
})
.collect(Collectors.toList());
if (mapList.isEmpty()) {
Map<String, String> map = new HashMap<>();
map.put("no", null);
map.put("name", null);
map.put("portion", null);
mapList.add(map);
}
return DynamicSource.createList("detail", mapList);
}
```
这里使用了Optional来避免对空List进行null检查,使用Stream API来处理List数据并返回一个新的List。同时将代码中的循环和判断合并到了一起,使代码更加简洁易读。
阅读全文