Java Stream API: Country and City Data Analysis
public record Country (String code, String name, String continent, double surfaceArea, int population, double gnp, int capital, List<City> cities) {
public record City(int id,String name,int population) { }
}
import java.util.*;
import java.util.stream.Collectors;
public class Main {
private static List<Movie> movies;
private static List<Country> countries;
public static void main(String[] args) {
initializeMovies();
initializeCountries();
}
1. Most Populated City of Each Continent
Map<String, Country.City> dictWithMostPopulatedCities = countries.stream()
.map(Country::continent).distinct()
.collect(Collectors.toMap(
continent -> continent,
continent -> countries.stream().filter(country -> country.continent().equals(continent))
.flatMap(country -> country.cities().stream()).max(Comparator.comparingInt(Country.City::population)).orElseThrow()
));
//System.out.println(dictWithMostPopulatedCities.entrySet());
2. Most Populated Capital
Country.City mostPopulatedCapital = countries.stream()
.flatMap(country -> country.cities().stream().filter(city -> city.id() == country.capital()))
.max(Comparator.comparingInt(Country.City::population)).orElseThrow();
// System.out.println(mostPopulatedCapital);
3. Most Populated Capital of Each Continent
Map<String, Country.City> mostPopulatedCapitalEachContinent = countries.stream().map(Country::continent).distinct().collect(Collectors.toMap(continent -> continent, continent -> countries.stream().flatMap(country1 -> country1.cities().stream().filter(city -> city.id() == country1.capital())) .max(Comparator.comparingInt(Country.City::population)).orElseThrow()));
4. Countries Sorted by Number of Cities (Descending)
List<Country> sortedInDescendent = countries.stream().sorted((a, b) -> Integer.compare(b.cities().size(), a.cities().size())).sorted((a, b) -> b.cities().size() - a.cities().size()).toList();
5. Countries Sorted by Population Density (Descending)
Ignoring countries with zero population.
List<Country> sortedInDescendent2 = countries.stream().filter(country -> country.population() / country.surfaceArea() > 0).sorted((a, b) -> b.cities().size() - a.cities().size()).toList();
6. Richest Country of Each Continent (by GNP)
Country mostGNPcountry = countries.stream().max(Comparator.comparingDouble(Country::gnp)).orElseThrow();
7. Minimum, Maximum, and Average Population
Of the countries in the world.
Map<String, Integer> minPopulationCities = countries.stream().collect(Collectors.toMap(Country::name,country -> country.cities().stream().min(Comparator.comparingInt(Country.City::population)).orElseThrow().population()));
Map<String, Integer> promPopulationCities = countries.stream().collect(Collectors.toMap(Country::name,country -> country.population() / country.cities().size()));
9. Countries with Minimum and Maximum Population
Country.City minCountry = countries.stream().flatMap(country -> country.cities().stream()).min(Comparator.comparing(Country.City::population)).orElseThrow();
Country.City maxCountry = countries.stream().flatMap(country -> country.cities().stream()).max(Comparator.comparing(Country.City::population)).orElseThrow();
11. Group Countries by Continent and Sort by City Count
Map<String, List<String>> ascendantOrder = countries.stream().map(Country::continent).distinct().collect(Collectors.toMap(continent -> continent, continent -> countries.stream().filter(country -> country.continent().equals(continent)).sorted(Comparator.comparingInt(a -> a.cities().size())).map(Country::name).toList()));
Map<String, List<String>> descendantOrder = countries.stream().map(Country::continent).distinct().collect(Collectors.toMap(continent -> continent, continent -> countries.stream().filter(country -> country.continent().equals(continent)).sorted((a, b) -> b.cities().size() - a.cities().size()).map(Country::name).toList()));
12. Cities with Minimum and Maximum Population in Each Country
Map<String, Integer> maxPopulatedCity = countries.stream().collect(Collectors.toMap(Country::name, country -> country.cities().stream().max(Comparator.comparingInt(Country.City::population)).orElseThrow().population()));
13. Minimum, Maximum, Average, and Standard Deviation of GNP
Double minGNP = countries.stream().map(Country::gnp).distinct().min(Comparator.comparingDouble(a -> a)).orElseThrow();
Double avgGNP = countries.stream().mapToDouble(Country::gnp).sum() / countries.stream().count();
Double sdGNP;