在Java开发中,获取列表(List)是一项基础且频繁的操作,无论是从数据库查询结果、文件读取数据,还是通过集合转换得到列表,掌握多种获取方式能够提升开发效率,本文将系统介绍Java中获取列表的常见方法,涵盖基础集合操作、数据流处理、数据库查询等多个场景,并附上代码示例与注意事项,帮助开发者全面理解不同场景下的最佳实践。
通过集合工具类直接创建列表
Java提供了java.util.Collections和java.util.Arrays工具类,支持快速创建初始化列表。Arrays.asList()是最常用的方法,可将数组转换为固定大小的列表。
String[] array = {"A", "B", "C"};
List<String> list = Arrays.asList(array);
需要注意的是,Arrays.asList()返回的列表是固定大小的,不支持添加或删除元素(会抛出UnsupportedOperationException),如果需要动态列表,可通过new ArrayList<>()构造函数创建新的可变列表:
List<String> dynamicList = new ArrayList<>(Arrays.asList(array));
Collections类还提供了nCopies()、singletonList()等方法用于创建特定模式的列表,如重复元素的列表或单元素列表。
使用Stream API动态生成列表
Java 8引入的Stream API为列表生成提供了更灵活的方式,通过Stream接口的静态方法(如of()、iterate()、generate())结合collect()操作,可动态构建复杂列表。
- 基于可变序列生成列表:
List<Integer> numbers = Stream.iterate(1, n -> n + 2) .limit(10) .collect(Collectors.toList()); // 结果为[1, 3, 5, 7, 9, 11, 13, 15, 17, 19] - 通过过滤、映射等操作转换数据源:
List<String> filteredList = Stream.of("apple", "banana", "cherry") .filter(s -> s.startsWith("a")) .collect(Collectors.toList()); // 结果为["apple"]Stream API的优势在于支持函数式编程,可链式调用多种操作(如
filter、map、sorted),适合处理复杂数据转换逻辑。
从数据库查询获取列表
在企业级应用中,从数据库获取列表是最常见的场景之一,以JDBC为例,通过执行查询语句并遍历结果集(ResultSet)可将数据封装为列表,以下是核心步骤:
- 加载数据库驱动并建立连接;
- 创建
Statement或PreparedStatement对象; - 执行查询并获取
ResultSet; - 遍历
ResultSet,将每行数据转换为对象并添加到列表中。
示例代码片段:
List<User> userList = new ArrayList<>();
String sql = "SELECT id, name, age FROM users";
try (Connection conn = DriverManager.getConnection(url, user, password);
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery()) {
while (rs.next()) {
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
user.setAge(rs.getInt("age"));
userList.add(user);
}
} catch (SQLException e) {
e.printStackTrace();
}
为简化开发,实际项目中常使用MyBatis、Hibernate等ORM框架,通过注解或XML配置直接将查询结果映射为列表,MyBatis的select语句可直接返回List<User>:
@Select("SELECT * FROM users WHERE age > #{age}")
List<User> findUsersByAge(int age);
从文件或网络数据源读取列表
在处理本地文件或HTTP请求时,常需将数据解析为列表,读取CSV文件并转换为List<Map<String, String>>:
List<Map<String, String>> csvList = new ArrayList<>();
try (BufferedReader reader = new BufferedReader(new FileReader("data.csv"))) {
String header = reader.readLine(); // 读取表头
String[] columns = header.split(",");
String line;
while ((line = reader.readLine()) != null) {
String[] values = line.split(",");
Map<String, String> row = new HashMap<>();
for (int i = 0; i < columns.length; i++) {
row.put(columns[i], values[i]);
}
csvList.add(row);
}
} catch (IOException e) {
e.printStackTrace();
}
对于JSON格式数据,可使用Gson或Jackson库将JSON数组反序列化为列表:
String json = "[{\"name\":\"Tom\",\"age\":25},{\"name\":\"Jerry\",\"age\":30}]";
List<User> users = new Gson().fromJson(json, new TypeToken<List<User>>(){}.getType());
集合转换与列表构建
在开发中,常需将其他集合类型(如Set、Queue)转换为列表,Java提供了构造函数或addAll()方法实现转换:
Set<String> set = new HashSet<>(Arrays.asList("X", "Y", "Z"));
List<String> listFromSet = new ArrayList<>(set);
Queue<Integer> queue = new LinkedList<>(Arrays.asList(1, 2, 3));
List<Integer> listFromQueue = new ArrayList<>(queue);
若需对现有列表进行筛选或转换,可使用List接口的subList()方法(注意返回的是视图,修改会影响原列表)或Stream API的collect()操作生成新列表。
注意事项与最佳实践
- 线程安全:若列表在多线程环境下使用,需选择线程安全类(如
CopyOnWriteArrayList)或通过Collections.synchronizedList()包装; - 空列表处理:避免直接使用
list.get(0)可能导致IndexOutOfBoundsException,可通过list.isEmpty()或Optional进行判空; - 性能优化:大数据量场景下,优先使用
ArrayList(随机访问快)而非LinkedList(插入/删除快);Stream API的并行流(parallelStream())可提升处理效率,但需注意线程安全; - 内存管理:通过
Arrays.asList()创建的列表避免修改其大小,防止UnsupportedOperationException。
Java中获取列表的方法多样,开发者需根据具体场景选择合适的方式:基础数据转换优先使用Arrays.asList()或Stream API;数据库交互依赖ORM框架或JDBC;文件/网络数据解析需结合IO流与第三方库,掌握不同方法的特性与注意事项,能够写出更高效、健壮的代码,在实际开发中,建议结合业务需求权衡性能与可读性,灵活运用列表获取技巧。