Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
地图<;整数,列表<;字符串>&燃气轮机;不使用java8之前的for循环创建_Java_List - Fatal编程技术网

地图<;整数,列表<;字符串>&燃气轮机;不使用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<>

我想从每个区域都有多个域的列表中创建zoneId到域列表映射。下面是我的代码,是否可以在没有java8之前的for循环的情况下编写代码

 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]}