Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.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
Java 转换映射<;?,映射<&燃气轮机;查看对象列表_Java_Java 8_Java Stream - Fatal编程技术网

Java 转换映射<;?,映射<&燃气轮机;查看对象列表

Java 转换映射<;?,映射<&燃气轮机;查看对象列表,java,java-8,java-stream,Java,Java 8,Java Stream,我有以下收藏: Map<String, Map<SomeEnum, Long>> map = ... 因为我知道所有枚举,所以我想将其转换为POJO列表。对象的定义如下: class SomeClass { String name; long bar1Value; long bar2Value; long bar3Value; } 我尝试过不同的解决方案,例如映射内部的映射: map.entrySet().stream() .map(e -> e

我有以下收藏:

Map<String, Map<SomeEnum, Long>> map = ...
因为我知道所有枚举,所以我想将其转换为POJO列表。对象的定义如下:

class SomeClass {
  String name;
  long bar1Value;
  long bar2Value;
  long bar3Value;
}
我尝试过不同的解决方案,例如映射内部的映射:

map.entrySet().stream()
.map(e -> e.getValue().entrySet().stream().map(innerEntry -> {
  long bar1 = 0;
  long bar2 = 0;
  long bar3 = 0;

  if(innerEntry.getKey().equals(SomeEnum.BAR1)) bar1 = innerEntry.getValue();
  if(innerEntry.getKey().equals(SomeEnum.BAR2)) bar2 = innerEntry.getValue();
  if(innerEntry.getKey().equals(SomeEnum.BAR3)) bar3 = innerEntry.getValue();

  return new SomeClass(e.getKey(), bar1, bar2, bar3);
}).collect(toList()).collect(toList());
不幸的是,我得到的是
列表


有没有其他更优雅的方法来处理这个问题?

map
更改为
flatMap
并删除第一个
toList()

List ss=map.entrySet().stream()
.flatMap(e->e.getValue().entrySet().stream().map(innerEntry->{
长棒1=0;
长棒2=0;
长棒3=0;
如果(innerEntry.getKey().equals(SomeEnum.BAR1))BAR1=innerEntry.getValue();
如果(innerEntry.getKey().equals(SomeEnum.BAR2))BAR2=innerEntry.getValue();
如果(innerEntry.getKey().equals(SomeEnum.BAR3))BAR3=innerEntry.getValue();
返回新的SomeClass(例如getKey(),bar1,bar2,bar3);
})).collect(Collectors.toList());

像这样的东西怎么样:

ArrayList<Integer> keyList = new ArrayList<Integer>(map.keySet());
for(int i=0; i<keyList.size(); i++){
    Map innermap = map.get(keyList.get(i));
    SomeClass obj = new SomeClass(keyList.get(i),innermap.get('bar1'),innermap.get('bar2'),innermap.get('bar3');
}
class SomeClass {

    String name;
    long bar1Value;
    long bar2Value;
    long bar3Value;
 List<SomeClass> list = new ArrayList<>();
    map.forEach((name,values)->{
        SomeClass s = new SomeClass();
        s.setName(name);
        values.forEach((t,value)->{
            s.setByEnum(t, value);
        });
        list.add(s);
    });
arraylistkeylist=newarraylist(map.keySet());
对于(int i=0;i你必须这样做:

首先添加一个方法,为每个枚举值设置de-specific long,如下所示:

ArrayList<Integer> keyList = new ArrayList<Integer>(map.keySet());
for(int i=0; i<keyList.size(); i++){
    Map innermap = map.get(keyList.get(i));
    SomeClass obj = new SomeClass(keyList.get(i),innermap.get('bar1'),innermap.get('bar2'),innermap.get('bar3');
}
class SomeClass {

    String name;
    long bar1Value;
    long bar2Value;
    long bar3Value;
 List<SomeClass> list = new ArrayList<>();
    map.forEach((name,values)->{
        SomeClass s = new SomeClass();
        s.setName(name);
        values.forEach((t,value)->{
            s.setByEnum(t, value);
        });
        list.add(s);
    });
//接球手和接球手

然后你必须使地图循环,类似这样:

ArrayList<Integer> keyList = new ArrayList<Integer>(map.keySet());
for(int i=0; i<keyList.size(); i++){
    Map innermap = map.get(keyList.get(i));
    SomeClass obj = new SomeClass(keyList.get(i),innermap.get('bar1'),innermap.get('bar2'),innermap.get('bar3');
}
class SomeClass {

    String name;
    long bar1Value;
    long bar2Value;
    long bar3Value;
 List<SomeClass> list = new ArrayList<>();
    map.forEach((name,values)->{
        SomeClass s = new SomeClass();
        s.setName(name);
        values.forEach((t,value)->{
            s.setByEnum(t, value);
        });
        list.add(s);
    });
List List=new ArrayList();
map.forEach((名称、值)->{
SomeClass s=新的SomeClass();
s、 集合名(名称);
forEach((t,value)->{
s、 挫折数(t,值);
});
列表。添加(s);
});

这对你有用吗

它需要目标类的构造函数,但只需获取值并创建实例,然后将它们收集到列表中

        List<SomeClass> list = map.entrySet().stream()
                .map(e -> new SomeClass(e.getKey(),
                        e.getValue().get(SomeEnum.BAR1),
                        e.getValue().get(SomeEnum.BAR2),
                        e.getValue().get(SomeEnum.BAR3)))
                .collect(Collectors.toList());

您可以使用一个实用程序简化整个任务,从内部映射创建
SomeClass

private SomeClass createSomeClass(String name, Map<SomeEnum, Long> innerMap) {
    return SomeClass.builder()
            .name(name)
            .bar1Value(innerMap.getOrDefault(SomeEnum.BAR1, 0L))
            .bar2Value(innerMap.getOrDefault(SomeEnum.BAR2, 0L))
            .bar3Value(innerMap.getOrDefault(SomeEnum.BAR3, 0L))
            .build();
}
private SomeClass createSomeClass(字符串名,映射innerMap){
返回SomeClass.builder()
.姓名(姓名)
.bar1Value(innerMap.getOrDefault(SomeEnum.BAR1,0L))
.bar2Value(innerMap.getOrDefault(SomeEnum.BAR2,0L))
.bar3Value(innerMap.getOrDefault(SomeEnum.BAR3,0L))
.build();
}
然后你的映射就会像--

List someClassList=map.entrySet().stream()
.map(e->createSomeClass(e.getKey(),e.getValue())
.collect(Collectors.toList());

您正在将
String
Enum
进行比较。这将不起作用。您可能需要尝试使用Enum的字符串表示形式进行比较。如果正确,内部映射中的键是Enum。可能需要
flatMap()
method?你说得对。我错过了。你应该试试
flatMap
而不是
map
assuggested@WJS我的错,示例数据是JSON格式的。正确的版本是签名。谢谢,它使地图平坦,但是,仍然存在一个问题-新列表包含每个正if的一个新对象。从我的示例代码中,ob名为“Foo”的对象将被创建三次,因为其中有三个值。
e.getValue().getOrDefault(SomeEnum.BAR1,0L)
to:)在编辑时,我决定不这样做,因为OP从未建议缺少任何枚举值。还有,一旦我看到你这么做了,我就把我的拿出来了。这整件事让我很困惑,因为OP的例子在他的内部映射中显示了一个字符串作为键。1。选择不在OP的代码中设置默认值容易出现NullPointerException。2.enum在JSON中的表示形式是它的名称,因此除了名称主要解析为enum值本身之外,它没有太大的错误。