
在日常的java开发中,我们经常会遇到需要处理复杂数据结构的情况。其中一种常见场景是拥有一个list<map<string, string>>,其中每个map代表一条记录,包含多个键值对。例如,一个交易列表可能包含“trip id”、“account”和“charged fare”等信息。当我们需要根据某个特定字段(例如“account”)将这些记录进行分组时,传统的迭代方法可能会显得冗长且效率低下。java 8引入的stream api为这类操作提供了强大且简洁的解决方案。
示例数据结构:
假设我们有以下交易数据,存储在一个List<Map<String, String>>中:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.stream.Collectors;
public class DataGroupingExample {
public static void main(String[] args) {
List<Map<String, String>> dataListMap = new ArrayList<>();
// 交易1
Map<String, String> dataMap1 = new HashMap<String, String>() {{
put("Charged fare", "3");
put("Trip ID", "1");
put("Account", "220");
}};
dataListMap.add(dataMap1);
// 交易2
Map<String, String> dataMap2 = new HashMap<String, String>() {{
put("Charged fare", "5");
put("Trip ID", "2");
put("Account", "220");
}};
dataListMap.add(dataMap2);
// 交易3
Map<String, String> dataMap3 = new HashMap<String, String>() {{
put("Charged fare", "7");
put("Trip ID", "3");
put("Account", "230");
}};
dataListMap.add(dataMap3);
// 交易4
Map<String, String> dataMap4 = new HashMap<String, String>() {{
put("Charged fare", "8");
put("Trip ID", "4");
put("Account", "230");
}};
dataListMap.add(dataMap4);
System.out.println("原始数据列表:");
dataListMap.forEach(System.out::println);
System.out.println("\n---");
// 接下来的分组和重组操作将基于此dataListMap
}
}我们的目标是根据"Account"键的值,将dataListMap中的元素分组,最终得到一个List<List<Map<String, String>>>,其中每个内部列表包含属于同一个账户的所有交易记录。
Java Stream API提供了一个强大的收集器Collectors.groupingBy(),它可以轻松实现基于某个属性的元素分组。
立即学习“Java免费学习笔记(深入)”;
分组实现:
// 继续上面的main方法
// 根据"Account"键的值对列表进行分组
List<List<Map<String, String>>> groupedByAccount =
new ArrayList<>(dataListMap.stream()
.collect(Collectors.groupingBy(item -> item.get("Account")))
.values());
System.out.println("按账户分组后的数据:");
groupedByAccount.forEach(list -> {
System.out.println("--- 账户组 ---");
list.forEach(System.out::println);
});
System.out.println("\n---");代码解析:
输出示例:
按账户分组后的数据:
--- 账户组 ---
{Charged fare=3, Trip ID=1, Account=220}
{Charged fare=5, Trip ID=2, Account=220}
--- 账户组 ---
{Charged fare=7, Trip ID=3, Account=230}
{Charged fare=8, Trip ID=4, Account=230}在某些场景下,我们可能需要将已经分组的List<List<Map<String, String>>>重新合并回一个单一的List<Map<String, String>>。虽然在大多数情况下,如果原始列表仍然可用,直接使用原始列表更简单,但了解如何进行这种“扁平化”操作仍然很有用,尤其是在数据经过转换或过滤后。
扁平化实现:
// 继续上面的main方法
// 将分组后的数据重新扁平化为一个列表
List<Map<String, String>> regroupedList = groupedByAccount.stream()
.flatMap(Collection::stream)
.collect(Collectors.toList());
System.out.println("重新扁平化后的数据:");
regroupedList.forEach(System.out::println);
System.out.println("\n---");代码解析:
输出示例:
重新扁平化后的数据:
{Charged fare=3, Trip ID=1, Account=220}
{Charged fare=5, Trip ID=2, Account=220}
{Charged fare=7, Trip ID=3, Account=230}
{Charged fare=8, Trip ID=4, Account=230}可以看到,结果与原始的dataListMap在内容上是一致的。
// 过滤掉Account为null的记录再分组
List<List<Map<String, String>>> groupedFiltered =
new ArrayList<>(dataListMap.stream()
.filter(item -> item.get("Account") != null)
.collect(Collectors.groupingBy(item -> item.get("Account")))
.values());本教程演示了如何使用Java Stream API高效地对List<Map<String, String>>进行分组和重组。Collectors.groupingBy()是实现复杂数据分组的强大工具,而flatMap()则提供了将多层集合扁平化的能力。掌握这些Stream操作将极大地提升你在Java中处理集合数据的效率和代码质量。记住,Stream API以其非侵入性和函数式编程风格,为现代Java开发带来了革命性的改变。
以上就是Java Stream API:根据Map键值对列表进行高效分组与重组的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号