
java 8引入的stream api为集合操作带来了极大的便利。要统计集合中特定属性的出现次数,我们主要依赖以下两个collectors:
当两者结合使用时,groupingBy会根据分类函数将元素分组,然后counting会统计每个分组中的元素个数,最终返回一个Map<K, Long>,其中K是分类键,Long是对应的计数。
为了更好地演示,我们将原始的List<Map<String, String>>数据结构转换为更符合Java编程习惯的POJO。这不仅提高了类型安全性,也使代码更易于理解和维护。
首先,创建一个FamilyMember类来表示每个家庭成员的详细信息。
import java.time.LocalDate;
public class FamilyMember {
private String memberType; // 家庭成员类型,如"Sibling", "Child", "Spouse"
private String fullName;
private LocalDate dateOfBirth;
private String gender;
public FamilyMember(String memberType, String fullName,
LocalDate dateOfBirth, String gender) {
this.memberType = memberType;
this.fullName = fullName;
this.dateOfBirth = dateOfBirth;
this.gender = gender;
}
// Getters for all fields are essential for Stream operations
public String getMemberType() {
return memberType;
}
public String getFullName() {
return fullName;
}
public LocalDate getDateOfBirth() {
return dateOfBirth;
}
public String getGender() {
return gender;
}
// Setters can be added if needed, but not strictly for this counting example
}说明: FamilyMember类封装了家庭成员的属性。其中,memberType是我们希望进行计数的关键属性。为了让Collectors.groupingBy能够访问到这个属性,必须提供相应的getter方法(getMemberType())。
立即学习“Java免费学习笔记(深入)”;
接下来,在主程序中创建FamilyMember对象列表,并使用Stream API进行计数。
import java.time.LocalDate;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class MemberCounter {
public static void main(String[] args) {
// 模拟数据:创建家庭成员列表
List<FamilyMember> listOfFamilyMember = Arrays.asList(
new FamilyMember("Sibling", "Sibling name", LocalDate.of(1990, 12, 12), "Male"),
new FamilyMember("Sibling", "Sibling name2", LocalDate.of(1990, 12, 12), "Male"),
new FamilyMember("Sibling", "Sibling name3", LocalDate.of(1990, 12, 12), "Male"),
new FamilyMember("Child", "Child name", LocalDate.of(2010, 12, 12), "Male"),
new FamilyMember("Child", "Child name2", LocalDate.of(2000, 12, 12), "Female"),
new FamilyMember("Spouse", "Spouse name", LocalDate.of(1990, 12, 12), "Male")
);
// 使用Stream API统计各类家庭成员的数量
Map<String, Long> countMembers = listOfFamilyMember.stream()
.collect(Collectors.groupingBy(FamilyMember::getMemberType, Collectors.counting()));
// 打印结果
System.out.println("家庭成员类型统计结果: " + countMembers);
}
}代码解析:
执行上述代码,将得到如下输出:
家庭成员类型统计结果: {Spouse=1, Sibling=3, Child=2}这个Map清晰地展示了每种家庭成员类型的出现次数。
Java 8 Stream API结合Collectors.groupingBy和Collectors.counting为统计集合中特定属性的出现次数提供了一个强大、简洁且富有表达力的解决方案。通过采用POJO作为数据模型,可以进一步提升代码的健壮性和可维护性。掌握这一模式,将极大地提高你在Java中处理数据聚合任务的效率。
以上就是使用Java 8 Stream统计集合中特定属性的出现次数的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号