我有这个Address类作为一个列表,我想创建一个以街道名称为键的地图,并将所有Address对象作为值的列表,街道名称是其中的一部分。假设我得到的地址是一个列表,所以我有一个地址列表。
public class Address{
private String streetName;
private String city;
private String country;
private String zipCode;
public String getStreetName() {
return streetName;
}
public void setStreetName(String streetName) {
this.streetName = streetName;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getZipCode() {
return zipCode;
}
public void setZipCode(String zipCode) {
this.zipCode = zipCode;
}
}
I was able to do this using Lambda with the below Code
Map<String, List<Address>> resultMap =
addressList.stream().collect(Collectors.groupingBy(address-> address.getStreetName())); // This creates Map with street name as key and list of addresses as values
我需要在Address上面创建一个包装器,这样它看起来就像
public class AddressWrapper {
private String streetName;
private List<Address> addressWrapperList;
public String getStreetName() {
return streetName;
}
public void setStreetName(String streetName) {
this.streetName = streetName;
}
public List<Address> getAddressWrapperList() {
return addressWrapperList;
}
public void setAddressWrapperList(List<Address> addressWrapperList) {
this.addressWrapperList= addressWrapperList;
}
}
现在有了addressList,我如何创建一个地图,以便不是街道名称作为键,属于该街道名称的地址列表作为值,而是创建一个地图,街道名称作为键,但值作为addressWrapperList(地址列表)
一种方法是从groupingby
操作的结果创建一个流,并收集到map
并将值映射器函数指定为AddressWrapper
。
Map<String, AddressWrapper> result = addressList.stream()
.collect(Collectors.groupingBy(Address::getStreetName))
.entrySet()
.stream()
.collect(Collectors.toMap(Map.Entry::getKey, e -> {
AddressWrapper addressWrapper = new AddressWrapper();
addressWrapper.setStreetName(e.getKey());
addressWrapper.setAddressWrapperList(e.getValue());
return addressWrapper;
}));
通过创建签名为public AddressWrapper(String streetName,list
addressWrapperList){...}
的构造函数,可以简化值映射器逻辑。则代码变为:
Map<String, AddressWrapper> result = addressList.stream()
.collect(Collectors.groupingBy(Address::getStreetName))
.entrySet()
.stream()
.collect(Collectors.toMap(Map.Entry::getKey,
e -> new AddressWrapper(e.getKey(), e.getValue())));
此外,您还可以使用tomap
收集器实现相同的结果,如下所示:
Map<String, AddressWrapper> resultSet = addressList.stream()
.collect(Collectors.toMap(Address::getStreetName,
e -> new AddressWrapper(e.getStreetName(),
new ArrayList<>(Collections.singletonList(e))),
(left, right) -> {
left.getAddressWrapperList().addAll(right.getAddressWrapperList());
return left;
}));
下面是Main中的随机客户端列表 第二类:产品(字符串名称、枚举类别、BigDecimal价格) 目标->预期结果:在类Main中,创建类Shopping的实例,其中属性是具有 的映射,并用随机数据//integer-购买了多少产品 null null
我有一个包含子对象列表的类,如下所示: 我有一个学生类列表,如下所示: 我可以使用传统的foreach循环对数据进行分组,但我想为此使用stream API,但不能这样做。你能帮忙吗?
我正在学习使用Java8和Stream做事情。我有一个问题,我正试图用java8流解决这个问题。 我有一个地图类型
我正在使用一个CSV文件,其中包含一些有关事故的信息。 我创建了事故类型: 我还创建了一个函数,可以读取所有CSV文件,将所有事故转换为列表 因此,我们正在处理我还不完全理解的流,我一直在做这个练习,我必须生成一个返回排序映射的函数 我尝试使用和以某种方式使其工作,但我不知道如何做到这一点。
我有两个表模式 员工 地址
我正在使用JPA编写一个Java EE应用程序,它需要国际化。为此,我创建了一个名为multilingarstring的类,该类将语言与字符串相关联(并扩展了HashMap 现在,假设我们有一个实体,它根据语言的不同有不同的名称: 此代码生成以下数据库模式: 这几乎是好事。 此实现的问题是重复字段上的和方法上的(每次需要在数据库BTW中映射时都必须重新编写:每个实体类至少1个)。在我看来,它使代码