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值本身之外,它没有太大的错误。