Collectors.GroupBy示例:如何在Java中进行分组

时间:2020-02-23 14:34:18  来源:igfitidea点击:

在本教程中,我们将看到Java 8 Collectors GroupBy示例。
GroupBy是Java 8中添加的另一个功能,它非常类似于SQL/Oracle。

让我们在榜样的帮助下更多地理解:让我们创建我们的模型类国家,如下所示:

package org.igi.theitroad;
 
public class Country{
 
 String countryName; 
 long population;
 
 public Country() {
  super();
 }
 public Country(String countryName,long population) {
  super();
  this.countryName = countryName;
  this.population=population;
 }
 public String getCountryName() {
  return countryName;
 }
 public void setCountryName(String countryName) {
  this.countryName = countryName;
 }
 public long getPopulation() {
  return population;
 }
 public void setPopulation(long population) {
  this.population = population;
 }
@Override
public int hashCode() {
 final int prime = 31;
 int result = 1;
 result = prime * result
   + ((countryName == null) ? 0 : countryName.hashCode());
 result = prime * result + (int) (population ^ (population >>> 32));
 return result;
}
@Override
public boolean equals(Object obj) {
 if (this == obj)
  return true;
 if (obj == null)
  return false;
 if (getClass() != obj.getClass())
  return false;
 Country other = (Country) obj;
 if (countryName == null) {
  if (other.countryName != null)
   return false;
 } else if (!countryName.equals(other.countryName))
  return false;
 if (population != other.population)
  return false;
 return true;
} 
 
 public String toString()
 {
  return "{"+countryName+","+population+"}";
 }
}

允许我们创建主类,我们将使用收藏家.groupby来做组。

package org.igi.theitroad;
 
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
 
public class Java8CollectorsGroupBy {
 public static void main(String[] args) {
 
  List items = Arrays.asList(new Country("Netherlands", 20000),
    new Country("China", 40000), new Country("Nepal", 30000),
    new Country("Netherlands", 50000), new Country("China", 10000));
  
  //Group by countryName
  Map<String, List> groupByCountry = items.stream().collect(
    Collectors.groupingBy(Country::getCountryName));
  
  System.out.println(groupByCountry.get("Netherlands"));
  
  //Group by CountryName and calculates the count
  Map<String, Long> counting = items.stream().collect(
    Collectors.groupingBy(Country::getCountryName,Collectors.counting()));
  
  //Group by countryName and sum up the population
  System.out.println(counting);
  Map<String, Long> populationCount = items.stream().collect(
    Collectors.groupingBy(Country::getCountryName,
      Collectors.summingLong(Country::getPopulation)));
  System.out.println(populationCount);
 }
}

运行上面的类时,我们将得到以下输出:

[{Netherlands,20000}, {Netherlands,50000}]
{China=2, Nepal=1, Netherlands=2}
{China=50000, Nepal=30000, Netherlands=70000}