【问题标题】:Access JSONObject field value in lambda expression访问 lambda 表达式中的 JSONObject 字段值
【发布时间】:2021-01-13 15:20:25
【问题描述】:

我对 Java 还是很陌生,而且我对函数式编程很熟悉。在这里,我正在尝试编写最简洁的工厂方法来创建基于从 API 检索到的 JSONArrayList<Manager>。这是我的想法的简化版本

public List<Manager> getManagers(HashMap parameters) throws IOException, InterruptedException {
    JSONArray records = (JSONArray) api.getData("Manager", parameters).get("records");
    records.forEach(x -> new Manager(x.get("FirstName"),x.get("LastName")))

以及我将如何在 python 中做到这一点(我有很大的偏见)

manager_list = list(map(lambda x: Manager(x["FirstName"],x["LastName"]),records))

我遇到了两个问题

  1. 访问 lambda 表达式 中的 JSONObject 字段

尽管 x 是 JSONObject

records.forEach(x -> System.out.println(x.getClass()));
class org.json.JSONObject

x.get("FirstName") 在 lambda 中不起作用。是因为.get() 是一个实例方法还是我遗漏了其他东西?

  1. 轻松将Managers 附加到列表中

这不起作用

List managers = records.forEach(x -> new Manager(x.get("FirstName"),x.get("LastName")))

因为forEach 返回voidforEach 有表亲可以返回任何类型的 InterableCollection 吗?

由于我是 java 新手,我既对我的实际问题的实现感兴趣,也对现代 java 中的函数式编程进行更一般的讨论

【问题讨论】:

  • 你确定org.json.JSONObjectIterable
  • JSONObject,不知道。当然,JSONArray 是可迭代的。使用System.out.println(x) 显示单个 json 对象没有问题
  • x.get('FirstName')你这里用的是单引号,只是想知道代码是怎么编译的。
  • @GyowannyPessattoQueiroz 我的错。更正
  • @TheHeadRush 是的,我是分心型

标签: java json lambda functional-programming


【解决方案1】:

尝试以下方法:

public List<Manager> getManagers(HashMap parameters) throws IOException, InterruptedException {
        
    JSONArray records = (JSONArray) api.getData("Employee", parameters).get("records");

    List<Manager> managers = new ArrayList<>();
    records.forEach(jsonRecord -> {
        JSONObject record = (JSONObject) jsonRecord;
        managers.add(new Manager(record.getString("FirstName"), record.getString("LastName")));
    });

    return managers;
    }

您可能必须将每个项目转换为 JSONObject 才能访问属性。

【讨论】:

  • 像一个魅力和相当简洁的作品。我喜欢它。我可以在接受之前稍微编辑您的答案吗(只是为了获得最终的List&lt;Manager&gt; 和完整的实现)?像我这样的菜鸟喜欢详尽的解决方案
  • 我很高兴它成功了,请继续编辑!
猜你喜欢
  • 1970-01-01
  • 2020-02-13
  • 1970-01-01
  • 2018-08-06
  • 2012-04-29
  • 1970-01-01
  • 2012-02-29
  • 2020-10-06
  • 1970-01-01
相关资源
最近更新 更多