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;