【问题标题】:Transform Map<String, Object> to Object using Java streams使用 Java 流将 Map<String, Object> 转换为 Object
【发布时间】:2022-01-17 22:46:33
【问题描述】:

我有一个 Map 我想把它转换成一个对象。 基本上地图将包含以下内容:

username xyz
password abc

我想把它转换成一个 SimpleUser 对象,它有两个字段:用户名和密码。 当前代码看起来像这样,但我想知道是否可以在 Stream 中进行对象初始化:

Map<String, String> user = adapter
    .getSecret("abc")
    .orElseThrow()
    .entrySet().stream()
    .collect(Collectors.toMap(Entry::getKey, v -> v.getValue().toString()));

return new SimpleUser(user.get("username"), user.get("password"));

【问题讨论】:

  • 如果这张地图是给1个用户的,为什么需要stream来创建一个简单的用户?
  • 您的地图是否只有 2 个条目(“用户名”、“密码”)?
  • 好像return adapter.getSecret("abc").map(user -&gt; new SimpleUser(user.get("username").toString(), user.get("password").toString())).orElseThrow();
  • @WingKuiTsoi 如果有另一种没有流的方法也很好,但我只是希望它干净易读。 Prasath 是的,它有
  • 但我只是希望它干净易读”——然后不要添加完全过时的 Stream 操作。使用像 Eklavya 展示的那样。

标签: java java-stream


【解决方案1】:

这是一种不好的做法,但将它们全部放在一行中是一种棘手的方法。 仅当 SimpleUser(对象)字段名称与 Map 相同时使用 jackson objectMapper,即用户名和密码。

SimpleUser u = new ObjectMapper().convertValue(
adapter.getSecret("abc")orElseThrow().entrySet().stream()
.collect(Collectors.toMap(Entry::getKey, v -> v.getValue().toString()))
, SimpleUser.class);

你将需要这个库。

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.0</version>
</dependency>

供您参考。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 2013-05-24
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多