【问题标题】:How to create an object with data in Java如何在 Java 中创建包含数据的对象
【发布时间】:2020-02-04 04:14:09
【问题描述】:

我正在编写一个函数,它将创建一个包含数据的对象。到目前为止,我得到了带有数据的对象,但不是单独作为一个集合。我想返回一个包含所有指定数据的对象作为一个学生对象,而不仅仅是每个对象的一个​​输入。我也尝试从 for 循环中添加 objList.add(obj) 并输出全部为空。 这是代码

class Student{  
   int id;     
   String name;    
   int age;         
public Student(int id, String name, int age) {  
        this.id = id;    
        this.name = name;         
        this.age = age;     
   } 
} 

public static List<Object> createObject(Student st, List<Map<String, String>> csvStudentData) {
    List<Object> objList = new ArrayList<>();
    Object obj = null;

    for(Map<String, String> studentData: csvStudentData) { 
       for (Map.Entry<String, String> entry = studentData.entrySet())  {
           String key = entry.getKey();
           String val = entry.getValue();
           obj = insertObjectData(st.getClass(), key, value);
           objList.add(obj);
       }
    }
    return objList;
}

【问题讨论】:

  • 您的 insertObjectData 方法是做什么的?你也可以发一下吗?
  • List&lt;Object&gt; objList = new ArrayList&lt;&gt;(); 这不应该是 ListStudents 吗?
  • 除非您解释 insertObjectData 的作用,否则很难回答。一个例子也会有所帮助
  • 有一个 Student 参数,其唯一目的是调用 getClass() 是一个有问题的设计。要获得对代表StudentClass 对象的引用,您可以使用Student.class。此外,不要在循环之外声明 obj 变量,因为它在那里没有意义。在你用insertObjectData(st.getClass(), key, value) 初始化它的地方声明它。或者省略它并将insertObjectData(st.getClass(), key, value) 直接传递给objList.add(…);

标签: java for-loop arraylist java-8


【解决方案1】:

您可以通过以下方式修改方法的主体:

public static List<Object> createObject(Student st, List<Map<String, String>> csvStudentData) {
    List<Student> objList = new ArrayList<>();
    for(Map<String, String> studentData: csvStudentData) { 
       Student student = new Student();
       for (Map.Entry<String, String> entry = studentData.entrySet())  {
           String key = entry.getKey();
           String val = entry.getValue();
           Field  field = Student.class.getDeclaredField(key);
           student.set(field, value);
       }
        objList.add(student);
    }
    return objList;
}

你还在Student类中添加了一个默认构造函数

【讨论】:

    【解决方案2】:

    你可以在 java-8 流中做到这一点

     List<Object> objList = csvStudentData.stream() 
                  .flatMap(map->map.entrySet()
                                   .stream()
                                   .map(entry->insertObjectData(st.getClass(), entry.getKey(), entry.getValue())))
                  .collect(Collectors.toList());
    

    【讨论】:

    • List&lt;Object&gt; - 表明他的设计有问题。
    • 是的,我同意@ScaryWombat,但我只是向他展示了使用 java-8 翻译当前的方法
    • @ScaryWombat 是的,但是根据问题的详细信息,该标签不合适。
    • 但在编辑之后就没有了。我可以帮助 OP 解决问题,因为它被标记为 java-8 我以为他正在寻找 java-8 解决方案
    • @Deadpool Java-8 的标签至少不合适,除非 OP 将问题完全修改为另一个问题。一方面,目前的问题和已标记的答案(this)无法帮助未来的读者。您认为您以任何方式提供的解决方案是否回答了上述问题? (对两者都投了反对票,抱歉。)
    猜你喜欢
    • 2010-12-31
    • 1970-01-01
    • 2019-04-22
    • 2017-05-23
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多