国外有名的设计网站,温州首页网络科技有限公司,深圳市交易中心官网,重庆网站建设软件1.简介 使用Java 8流#xff0c;可以很容易地根据不同的标准对对象集合进行分组。 在这篇文章中#xff0c;我们将看到如何从简单的单级分组到更复杂的#xff0c;涉及多个级分组的分组。 我们将使用两个类来表示我们要分组的对象#xff1a;人和宠物。 人类 public cla… 1.简介 使用Java 8流可以很容易地根据不同的标准对对象集合进行分组。 在这篇文章中我们将看到如何从简单的单级分组到更复杂的涉及多个级分组的分组。 我们将使用两个类来表示我们要分组的对象人和宠物。 人类 public class Person {private final String name;private final String country;private final String city;private final Pet pet;public Person(String name, String country, String city, Pet pet) {this.name name;this.country country;this.city city;this.pet pet;}public String getName() {return name;}public String getCountry() {return country;}public String getCity() {return city;}public Pet getPet() {return pet;}Overridepublic String toString() {return Person{ name name \ , country country \ , city city \ };}
} 宠物课 public class Pet {private final String name;private final int age;public Pet(String name, int age) {this.name name;this.age age;}public String getName() {return name;}public int getAge() {return age;}Overridepublic String toString() {return Pet{ name name \ , age age };}
} 在主要方法中我们创建将在以下各节中使用的集合。 public static void main(String[] args) {Person person1 new Person(John, USA, NYC, new Pet(Max, 5));Person person2 new Person(Steve, UK, London, new Pet(Lucy, 8));Person person3 new Person(Anna, USA, NYC, new Pet(Buddy, 12));Person person4 new Person(Mike, USA, Chicago, new Pet(Duke, 10));ListPerson persons Arrays.asList(person1, person2, person3, person4); 您可以在此处查看源代码。 2.单层分组 最简单的分组形式是单级分组。 在此示例中我们将按其国家/地区对集合中的所有人员进行分组 public void singleLevelGrouping(ListPerson persons) {final MapString, ListPerson personsByCountry persons.stream().collect(groupingBy(Person::getCountry));System.out.println(Persons in USA: personsByCountry.get(USA));
} 如果我们查看地图就会看到每个国家如何包含其公民列表 结果显示居住在指定国家/地区的人 Persons in USA: [Person{nameJohn, countryUSA, cityNew York}, Person{nameAnna, countryUSA, cityNew York}, Person{nameMike, countryUSA, cityChicago}]3.两级分组 在此示例中我们将不仅按国家/地区分组还按城市分组。 为此我们需要实现两级分组。 我们将按国家对人员进行分组对于每个国家我们将按其居住城市对人员进行分组。 为了允许多级分组类Collectors中的groupingBy方法支持附加的Collector作为第二个参数 public static T, K, A, DCollectorT, ?, MapK, D groupingBy(Function? super T, ? extends K classifier,Collector? super T, A, D downstream) 让我们使用此方法来实现我们的两级分组 public void twoLevelGrouping(ListPerson persons) {final MapString, MapString, ListPerson personsByCountryAndCity persons.stream().collect(groupingBy(Person::getCountry,groupingBy(Person::getCity)));System.out.println(Persons living in London: personsByCountryAndCity.get(UK).get(London).size());
} 如果我们调试执行我们将看到人员的分布情况 4.三级分组 在最后一个示例中我们将更进一步并按国家/地区城市和宠物的名字对人进行分组。 为了便于阅读我将其分为两种方法 public void threeLevelGrouping(ListPerson persons) {final MapString, MapString, MapString, ListPerson personsByCountryCityAndPetName persons.stream().collect(groupingBy(Person::getCountry,groupByCityAndPetName()));System.out.println(Persons whose pet is named Max and live in NY: personsByCountryCityAndPetName.get(USA).get(NYC).get(Max).size());
}private CollectorPerson, ?, MapString, MapString, ListPerson groupByCityAndPetName() {return groupingBy(Person::getCity, groupingBy(p - p.getPet().getName()));
} 现在我们有了三个嵌套的地图其中包含每个人员列表 5.结论 Java 8 Collectors API为我们提供了一种对集合进行分组的简便方法。 通过嵌套收集器我们可以添加不同的组层以实现多级分组。 翻译自: https://www.javacodegeeks.com/2016/03/multi-level-grouping-streams.html