如何解决如何将一种类型的Map转换为另一种类型,使用Lambda复制字段中的值?
我上课
- 第一种类型
@Value
class BundleOne{
private String first;
private String second;
}
- 第二种类型
class BundleSecond{
private String first;
private String second;
// here is setters and getters
}
我需要改造
Map
使用的lambda表达式。
到
Map
有人提供了这种转换的例子吗?
更新_1
上图显示我无法获取方法。尽管我尝试在bean上添加注解@Lombok(对于我们的示例-它是BundleOne。
m -a是lambda表达式中的局部变量,用于存储当前的类型处理对象-BundleOne
解决方法
具有私有字段且没有getter的类没有太大用处,因此我添加了它们以及构造函数。 其工作原理如下。
- 为源地图创建entrySets流。
- 使用条目获取b1对象和条目值
- 对该对象使用
getters
来填充新地图。
Map<BundleOne,String> mapB1 = ..<Source map with data>
Map<BundleSecond,String> mapB2 = mapB1.entrySet().stream()
.collect(Collectors.toMap(
e -> new BundleSecond(e.getKey().getFirst(),e.getKey().getSecond()),Entry::getValue));
class BundleOne {
private String first;
private String second;
public BundleOne(String first,String second) {
this.first = first;
this.second = second;
}
public String getFirst() {
return first;
}
public String getSecond() {
return second;
}
}
class BundleSecond{
private String first;
private String second;
public BundleSecond(String first,String second) {
this.first = first;
this.second = second;
}
public String getFirst() {
return first;
}
public String getSecond() {
return second;
}
}
这是一个例子
Map<BundleOne,String> mapB1 = new HashMap<>();
mapB1.put(new BundleOne("A","B"),"Foo");
mapB1.put(new BundleOne("C","D"),"Fax");
mapB1.put(new BundleOne("E","F"),"Bar");
mapB1.put(new BundleOne("G","H"),"Bax");
Map<BundleSecond,String> mapB2 = mapB1.entrySet().stream()
.collect(Collectors.toMap(
e -> new BundleSecond(e.getKey().getFirst(),Entry::getValue));
mapB1.entrySet().forEach(System.out::println);
System.out.println("----------------------");
mapB2.entrySet().forEach(System.out::println);
打印(输出顺序可能不同,但地图相同)。
[A,B]=Foo
[G,H]=Bax
[C,D]=Fax
[E,F]=Bar
----------------------
[A,B]=Foo
[C,D]=Fax
[G,H]=Bax
[E,F]=Bar
,
我假设您在两个类中都具有getter,setter和构造函数,并且其中都包含字段。
您可以使用map1
函数将<BundleOne,String>
(map2
)的条目转换为<BundleSecond,String>
(map()
)的条目。
应该是这样的:
Map<BundleSecond,String> map2 = map1.entrySet().stream()
.map(e -> new AbstractMap.SimpleEntry<BundleSecond,String>(
new BundleSecond(e.getKey().getFirst(),e.getValue()))
.collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue));
,
您可以使用Stream API。使用body
收集地图作为新创建的Collectors.toMap
作为键,并将地图键的值作为新地图的值。
BundleSecond
注意:要访问私有字段,您需要在Map<BundleSecond,String> map2 =
map1.entrySet()
.stream()
.collect(Collectors.toMap(
m -> new BundleSecond(m.getKey().getFirst(),m.getKey().getSecond()),m -> m.getValue()));
中使用getter并使用BundleOne
的所有参数构造函数来创建它。
这是我的解决办法。
Map<BundleIdDto,String> map2 = map1.entrySet()
.stream()
.collect(Collectors.toMap(
entry -> toBundleIdDto(entry.getKey()),entry -> entry.getValue())
);
private static BundleIdDto toBundleIdDto(BundleId bundleId){
BundleIdDto bundleIdDto = new BundleIdDto();
bundleIdDto.setField1(bundleId.getField1());
bundleIdDto.setField2(bundleId.getField2());
return bundleIdDto;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。