List of lists to a map of flatten map of lists 列表列表列表
List of lists of lists to a map of flatten map of lists
我有一个列表(州)列表(城市)列表(城镇)。如何将中间列表(城市)展平并转换为列表(城镇)的地图(城镇名称)的地图(州名称)?
这个问题可能看起来与另一个问题 相似,但它们并不相同。这一个,我需要压平其中一个列表。
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Data
@AllArgsConstructor
class Country {
private String name;
private List<State> states;
}
@Data
@AllArgsConstructor
class State {
private String name;
private List<City> cities;
}
@Data
@AllArgsConstructor
class City {
private String name;
private List<Town> towns;
}
@Data
@AllArgsConstructor
class Town {
private String name;
private String address;
private Integer population;
}
public static void main(String[]args) {
List<Town> countryAStateACityATownsList = new ArrayList();
countryAStateACityATownsList.add(new Town("CountryA-StateA-CityA-TownA", "addressOfCountryA-StateA-CityA-TownA", 100));
countryAStateACityATownsList.add(new Town("CountryA-StateA-CityA-TownB", "addressOfCountryA-StateA-CityA-TownB", 100));
countryAStateACityATownsList.add(new Town("CountryA-StateA-CityA-TownC", "addressOfCountryA-StateA-CityA-TownC", 100));
List<Town> countryAStateACityBTownsList = new ArrayList();
countryAStateACityBTownsList.add(new Town("CountryA-StateA-CityB-TownA", "addressOfCountryA-StateA-CityB-TownA", 100));
countryAStateACityBTownsList.add(new Town("CountryA-StateA-CityB-TownB", "addressOfCountryA-StateA-CityB-TownB", 100));
countryAStateACityBTownsList.add(new Town("CountryA-StateA-CityB-TownC", "addressOfCountryA-StateA-CityB-TownC", 100));
List<Town> countryAStateACityCTownsList = new ArrayList();
countryAStateACityCTownsList.add(new Town("CountryA-StateA-CityC-TownA", "addressOfCountryA-StateA-CityC-TownA", 100));
countryAStateACityCTownsList.add(new Town("CountryA-StateA-CityC-TownB", "addressOfCountryA-StateA-CityC-TownB", 100));
countryAStateACityCTownsList.add(new Town("CountryA-StateA-CityC-TownC", "addressOfCountryA-StateA-CityC-TownC", 100));
City cityA = new City("cityA", countryAStateACityATownsList);
City cityB = new City("cityB", countryAStateACityBTownsList);
City cityC = new City("cityC", countryAStateACityCTownsList);
List<City> countryAStateACitiesList = new ArrayList<>();
countryAStateACitiesList.add(cityA);
countryAStateACitiesList.add(cityB);
countryAStateACitiesList.add(cityC);
State stateA = new State("stateA",countryAStateACitiesList);
Country countryA = new Country("countryA", Collections.singletonList(stateA));
}
}
我想要一张城镇地图。 (所以城市列表是扁平化的):
state.name -> town.name -> 城镇。
我想做一些类似 destinationMap.get("stateA").get("CountryA-StateA-CityA-TownA") 的事情,这会给我一个名为“CountryA-StateA-CityA-TownA”的城镇实例.
请帮忙,我一直在尝试使用流来完成此操作,但目前无法完成。
我试过这个:
countryA.getStates()
.stream()
.collect(Collectors.toMap(State::getName,
st-> st.getCities()
.stream()
.collect(Collectors.toMap(City::getName,
City::getTowns))));
这将创建 state.name 到 city.name 到城镇的地图。但这不是我想要的。
我想要一张 state.name 到 town.name 到同名城镇的地图。
我喜欢 Java 的功能部分,这是我所做的,似乎按照您想要检索城镇的方式工作。
Map<String, Map<String, Town>> map =
countryA.getStates()
.stream()
.collect(Collectors.toMap(State::getName,
st -> st.getCities()
.stream()
.map(City::getTowns)
.flatMap(List::stream)
.collect(Collectors.toMap(Town::getName, Function.identity()))));
System.out.println(map.get("stateA").get("CountryA-StateA-CityA-TownA"));
给出输出
Town{name='CountryA-StateA-CityA-TownA', address='addressOfCountryA-StateA-CityA-TownA', population=100}
请注意,您的示例中有重复项,我假设不同城市的城镇不应重复。让我知道这是否是您想要的!
我有一个列表(州)列表(城市)列表(城镇)。如何将中间列表(城市)展平并转换为列表(城镇)的地图(城镇名称)的地图(州名称)?
这个问题可能看起来与另一个问题
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Data
@AllArgsConstructor
class Country {
private String name;
private List<State> states;
}
@Data
@AllArgsConstructor
class State {
private String name;
private List<City> cities;
}
@Data
@AllArgsConstructor
class City {
private String name;
private List<Town> towns;
}
@Data
@AllArgsConstructor
class Town {
private String name;
private String address;
private Integer population;
}
public static void main(String[]args) {
List<Town> countryAStateACityATownsList = new ArrayList();
countryAStateACityATownsList.add(new Town("CountryA-StateA-CityA-TownA", "addressOfCountryA-StateA-CityA-TownA", 100));
countryAStateACityATownsList.add(new Town("CountryA-StateA-CityA-TownB", "addressOfCountryA-StateA-CityA-TownB", 100));
countryAStateACityATownsList.add(new Town("CountryA-StateA-CityA-TownC", "addressOfCountryA-StateA-CityA-TownC", 100));
List<Town> countryAStateACityBTownsList = new ArrayList();
countryAStateACityBTownsList.add(new Town("CountryA-StateA-CityB-TownA", "addressOfCountryA-StateA-CityB-TownA", 100));
countryAStateACityBTownsList.add(new Town("CountryA-StateA-CityB-TownB", "addressOfCountryA-StateA-CityB-TownB", 100));
countryAStateACityBTownsList.add(new Town("CountryA-StateA-CityB-TownC", "addressOfCountryA-StateA-CityB-TownC", 100));
List<Town> countryAStateACityCTownsList = new ArrayList();
countryAStateACityCTownsList.add(new Town("CountryA-StateA-CityC-TownA", "addressOfCountryA-StateA-CityC-TownA", 100));
countryAStateACityCTownsList.add(new Town("CountryA-StateA-CityC-TownB", "addressOfCountryA-StateA-CityC-TownB", 100));
countryAStateACityCTownsList.add(new Town("CountryA-StateA-CityC-TownC", "addressOfCountryA-StateA-CityC-TownC", 100));
City cityA = new City("cityA", countryAStateACityATownsList);
City cityB = new City("cityB", countryAStateACityBTownsList);
City cityC = new City("cityC", countryAStateACityCTownsList);
List<City> countryAStateACitiesList = new ArrayList<>();
countryAStateACitiesList.add(cityA);
countryAStateACitiesList.add(cityB);
countryAStateACitiesList.add(cityC);
State stateA = new State("stateA",countryAStateACitiesList);
Country countryA = new Country("countryA", Collections.singletonList(stateA));
}
}
我想要一张城镇地图。 (所以城市列表是扁平化的): state.name -> town.name -> 城镇。 我想做一些类似 destinationMap.get("stateA").get("CountryA-StateA-CityA-TownA") 的事情,这会给我一个名为“CountryA-StateA-CityA-TownA”的城镇实例.
请帮忙,我一直在尝试使用流来完成此操作,但目前无法完成。
我试过这个:
countryA.getStates()
.stream()
.collect(Collectors.toMap(State::getName,
st-> st.getCities()
.stream()
.collect(Collectors.toMap(City::getName,
City::getTowns))));
这将创建 state.name 到 city.name 到城镇的地图。但这不是我想要的。
我想要一张 state.name 到 town.name 到同名城镇的地图。
我喜欢 Java 的功能部分,这是我所做的,似乎按照您想要检索城镇的方式工作。
Map<String, Map<String, Town>> map =
countryA.getStates()
.stream()
.collect(Collectors.toMap(State::getName,
st -> st.getCities()
.stream()
.map(City::getTowns)
.flatMap(List::stream)
.collect(Collectors.toMap(Town::getName, Function.identity()))));
System.out.println(map.get("stateA").get("CountryA-StateA-CityA-TownA"));
给出输出
Town{name='CountryA-StateA-CityA-TownA', address='addressOfCountryA-StateA-CityA-TownA', population=100}
请注意,您的示例中有重复项,我假设不同城市的城镇不应重复。让我知道这是否是您想要的!