地图<;整数,列表<;字符串>&燃气轮机;不使用java8之前的for循环创建
我想从每个区域都有多个域的列表中创建zoneId到域列表映射。下面是我的代码,是否可以在没有java8之前的for循环的情况下编写代码地图<;整数,列表<;字符串>&燃气轮机;不使用java8之前的for循环创建,java,list,Java,List,我想从每个区域都有多个域的列表中创建zoneId到域列表映射。下面是我的代码,是否可以在没有java8之前的for循环的情况下编写代码 private Map<Integer, List<String>> buildZoneIdDomainMap() { // TODO Auto-generated method stub Map<Integer, List<String>> retVal = new HashMap<>
private Map<Integer, List<String>> buildZoneIdDomainMap() {
// TODO Auto-generated method stub
Map<Integer, List<String>> retVal = new HashMap<>();
List<DomainCustomerZoneDtls> dczList = null;
List<String> strList = null;
Map<Integer,List<DomainCustomerZoneDtls>> map =
domainCustzoneList.parallelStream().collect(
Collectors.groupingBy(DomainCustomerZoneDtls::getCustomerZoneId));
for(Map.Entry<Integer, List<DomainCustomerZoneDtls>>
entryVal:map.entrySet()) {
dczList = entryVal.getValue();
strList = new ArrayList<>();
for(DomainCustomerZoneDtls dcz:dczList) {
strList.add(dcz.getDomain());
}
retVal.put(entryVal.getKey(), strList);
}
return retVal;
}
package test.support;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class DomainCustomerZoneDtls {
private String domain;
private Integer customerZoneId;
}
private Map buildZoneIdDomainMap(){
//TODO自动生成的方法存根
Map retVal=new HashMap();
列表dczList=null;
列表strList=null;
地图=
DomainCustZonelList.parallelStream().collect(
Collectors.groupingBy(DomainCustomerZoneDtls::getCustomerZoneId));
用于(地图输入)
entryVal:map.entrySet()){
dczList=entryVal.getValue();
strList=newarraylist();
对于(域CustomerZoneDTLS dcz:dczList){
添加(dcz.getDomain());
}
put(entryVal.getKey(),strList);
}
返回返回;
}
包测试支持;
导入lombok.allargsconstuctor;
导入龙目数据;
导入lombok.noargsconstuctor;
@资料
@诺尔格构装师
@AllArgsConstructor
公共类DomainCustomerZoneDls{
私有字符串域;
私有整数customerZoneId;
}
为了清晰起见,请转换为更简单的案例。我希望它是等效的-如果不是,请告诉我
public class Mapping {
private static List<Person> people = List.of(
new Person("Fred", 15), new Person("Anne", 17), new Person("Joe", 15));
private static class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
int getAge() {
return age;
};
String getName() {
return name;
};
}
public static void main(String[] args) {
Map<Integer,List<String>> ageMap = people.stream()
.collect(groupingBy(Person::getAge, mapping(Person::getName, toList())));
ageMap.forEach((age, names) -> System.out.println(age + ":" + names));
}
}
公共类映射{
私有静态列表人员=List.of(
新人(“弗雷德”,15岁)、新人(“安妮”,17岁)、新人(“乔”,15岁));
私人静态类人{
私有最终字符串名;
私人最终年龄;
公众人物(字符串名称,整数年龄){
this.name=名称;
这个。年龄=年龄;
}
int getAge(){
回归年龄;
};
字符串getName(){
返回名称;
};
}
公共静态void main(字符串[]args){
Map ageMap=people.stream()
.collect(groupingBy(Person::getAge,mapping(Person::getName,toList()));
ageMap.forEach((年龄,名称)->System.out.println(年龄+”:“+名称));
}
}
您可以为此使用收集器
代码
不清楚“没有java8之前的for循环”是什么意思。您是否正在尝试将for-each循环重写为流操作?你这样做的动机是什么?是的,我正试图将for-each循环重写为流操作。听起来你在寻找一个。是的,它成功了。顺便说一句,掌握java8编程结构的最佳站点是什么。虽然我读了很多书,但无法正确地应用于编程问题:(很高兴它有帮助。老实说,我没有一个网站可以推荐。这取决于你到底想学什么。也许从这里开始:@GarrethGolding你的下游收集器比它需要的复杂得多。Collectors.mapping(DomainCustomerZoneDtls::getDomain,Collectors.toList())
可以。感谢@sprinter.的反馈。。我不知道Collectors.mapping()
方法。@SriramArgapuri我的答案中有它-你只需要转换到你的域(即替换类名)当然。我会试试这个。映射函数会做什么。我在那里遇到一个语法错误。我将其转换为一个完整的示例,以便您可以在上下文中看到它。映射函数将Person
对象流转换为一个名称流,然后收集到一个列表中。
public static void main(String[] args) {
List<DomainCustomerZoneDtls> domainCustomerZoneDtls = Arrays.asList(
new DomainCustomerZoneDtls("abc", 1),
new DomainCustomerZoneDtls("abc", 2),
new DomainCustomerZoneDtls("abc", 3),
new DomainCustomerZoneDtls("efg", 1),
new DomainCustomerZoneDtls("efg", 2)
);
Map<Integer, List<String>> integerListMap = buildZoneIdDomainMap(domainCustomerZoneDtls);
System.out.println(integerListMap);
}
private static Map<Integer, List<String>> buildZoneIdDomainMap(List<DomainCustomerZoneDtls> domainCustomerZoneDtls) {
return domainCustomerZoneDtls.stream()
.collect(Collectors.groupingBy(DomainCustomerZoneDtls::getCustomerZoneId,
Collector.of(
ArrayList::new,
(strings, domainCustomerZoneDtls1) -> strings.add(domainCustomerZoneDtls1.getDomain()),
(strings, strings2) -> {
strings.addAll(strings2);
return strings;
}
)));
}
{1=[abc, efg], 2=[abc, efg], 3=[abc]}