java: 找不到符号 符号: 方法 getOrDefault(java.lang.String,int) 位置: 类型为java.util.Map<java.lang.String,java.lang.Integer>的变量 vnMap
时间: 2023-10-26 19:16:03 浏览: 69
这个错误提示说找不到 `getOrDefault` 方法,因为在 `Map` 接口中并没有 `getOrDefault` 方法,这个方法是在 Java 8 中引入的。你可以检查一下你的 Java 版本是否低于 8。
如果你的 Java 版本是 8 或以上,那么可能是因为你的 `vnMap` 变量的类型不是 `java.util.Map<java.lang.String, java.lang.Integer>`,或者是因为你的 `vnMap` 变量没有被正确地初始化。
你可以检查一下 `vnMap` 变量的类型和初始化方式,或者在调用 `getOrDefault` 方法之前先使用 `containsKey` 方法检查一下 `vnMap` 是否包含指定的键。如果不包含,你可以选择使用 `put` 方法来添加一个默认值。例如:
```java
Map<String, Integer> vnMap = new HashMap<>();
String key = "someKey";
int defaultValue = 0;
if (!vnMap.containsKey(key)) {
vnMap.put(key, defaultValue);
}
int value = vnMap.getOrDefault(key, defaultValue);
```
相关问题
Cannot invoke "java.lang.Integer.intValue()" because the return value of "java.util.HashMap.getOrDefault(Object, Object)" is null
这个问题的原因是在使用`HashMap`的`getOrDefault`方法时,返回的值为`null`,而你尝试将其转换为`Integer`类型并调用`intValue()`方法,导致出现了`NullPointerException`异常。这是因为`getOrDefault`方法在找不到对应的键时会返回默认值,而默认值为`null`。因此,在使用返回值之前,你需要先进行空值判断,以避免出现异常。
以下是一个示例代码,展示了如何处理这个问题:
```java
HashMap<String, Integer> map = new HashMap<>();
map.put("key", 123);
Integer value = map.getOrDefault("key", null);
if (value != null) {
int intValue = value.intValue();
System.out.println("Value: " + intValue);
} else {
System.out.println("Key not found");
}
```
在这个示例中,我们首先使用`getOrDefault`方法获取键对应的值,如果值不为`null`,则将其转换为`int`类型并打印输出。否则,打印输出"Key not found"。
java8实现:将List<ADto>出力成csv文件。参数为List<ADto>、ADto.class、filePath
可以使用Java 8提供的Stream API来实现将List<ADto>输出成csv文件的功能。具体实现步骤如下:
1. 定义csv文件的列头信息。
2. 使用Stream API将List<ADto>转换为List<String[]>,其中每个String数组表示一行csv数据。
3. 使用Java 8提供的Files.write()方法将List<String[]>写入到csv文件中。
以下是完整的代码实现:
```java
import java.io.IOException;
import java.lang.reflect.Field;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class CsvUtil {
/**
* 将List<ADto>输出成csv文件
*
* @param dataList 数据列表
* @param clazz 数据类
* @param filePath 文件路径
*/
public static <T> void writeCsv(List<T> dataList, Class<T> clazz, String filePath) throws IOException {
// 定义csv文件的列头信息
String[] headers = getFieldNames(clazz);
// 将List<ADto>转换为List<String[]>,其中每个String数组表示一行csv数据
List<String[]> rows = dataList.stream()
.map(data -> {
String[] row = new String[headers.length];
for (int i = 0; i < headers.length; i++) {
try {
Field field = clazz.getDeclaredField(headers[i]);
field.setAccessible(true);
Object value = field.get(data);
row[i] = value == null ? "" : value.toString();
} catch (ReflectiveOperationException e) {
e.printStackTrace();
}
}
return row;
})
.collect(Collectors.toList());
// 将List<String[]>写入到csv文件中
Files.write(Paths.get(filePath), encodeCsv(rows).getBytes());
}
/**
* 获取类的所有字段名
*/
private static <T> String[] getFieldNames(Class<T> clazz) {
return Stream.of(clazz.getDeclaredFields())
.map(Field::getName)
.toArray(String[]::new);
}
/**
* 编码csv数据
*/
private static String encodeCsv(List<String[]> rows) {
StringBuilder sb = new StringBuilder();
for (String[] row : rows) {
for (int i = 0; i < row.length; i++) {
sb.append(row[i]);
if (i < row.length - 1) {
sb.append(",");
}
}
sb.append("\n");
}
return sb.toString();
}
}
```
使用示例:
```java
public static void main(String[] args) throws IOException {
// 构造数据列表
List<ADto> dataList = new ArrayList<>();
dataList.add(new ADto("001", "foo", 20));
dataList.add(new ADto("002", "bar", 30));
// 输出csv文件
CsvUtil.writeCsv(dataList, ADto.class, "output.csv");
}
```
其中ADto为数据类,定义如下:
```java
public class ADto {
private String id;
private String name;
private int age;
public ADto(String id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
```