为了账号安全,请及时绑定邮箱和手机立即绑定

Java - 将带有列表变量的对象转换为对象列表

Java - 将带有列表变量的对象转换为对象列表

一只斗牛犬 2022-05-12 15:47:27
我的基础课是:public class Student {  public String name;  public String className; // In real code I'd have a second object for return to the end user  public List<String> classes; // Can be zero}我想把它弄平,这样我就可以返回类似的东西[  {    "name":"joe",    "class":"science"  },  {    "name":"joe",    "class":"math"  },]为了简单起见,显然是一个愚蠢的例子。我能够做到这一点的唯一方法是通过一些冗长的代码,例如:List<Student> students = getStudents();List<Student> outputStudents = new ArrayList<>();students.forEach(student -> {  if(student.getClasses().size() > 0) {    student.getClasses().forEach(clazz -> {      outputStudents.add(new Student(student.getName(), clazz));    });  } else {    outputStudents.add(student);  }});看看是否有办法简化这一点,也许使用flapMap?
查看完整描述

2 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

一种方法是根据条件对当前的 s 列表进行分区,Student如果其中的类为空或不为空


Map<Boolean, List<Student>> conditionalPartitioning = students.stream()

        .collect(Collectors.partitioningBy(student -> student.getClasses().isEmpty(), Collectors.toList()));

然后进一步使用这个分区到flatMap一个新学生列表中,因为他们里面有课程,并将concat它们与另一个分区一起使用,最终收集到结果中:


List<Student> result = Stream.concat(

        conditionalPartitioning.get(Boolean.FALSE).stream() // classes as a list

                .flatMap(student -> student.getClasses() // flatmap based on each class

                        .stream().map(clazz -> new Student(student.getName(), clazz))),

        conditionalPartitioning.get(Boolean.TRUE).stream()) // with classes.size = 0

        .collect(Collectors.toList());


查看完整回答
反对 回复 2022-05-12
?
慕码人8056858

TA贡献1803条经验 获得超6个赞

是的,您应该能够执行以下操作:


Student student = ?

List<Student> output = 

    student

        .getClasses()

        .stream()

        .map(clazz -> new Student(student.getName, student.getClassName, clazz))

        .collect(Collectors.toList());

对于一个学生。对于一群学生来说,这有点复杂:


(由于@nullpointer 评论中的观察而更新。谢谢!)


List<Student> listOfStudents = getStudents();

List<Student> outputStudents =

    listOfStudents

        .stream()

        .flatMap(student -> {

            List<String> classes = student.getClasses();

            if (classes.isEmpty()) return ImmutableList.of(student).stream();

            return classes.stream().map(clazz -> new Student(student.getName(), student.getClassName(), ImmutableList.of(clazz)));

        })

        .collect(Collectors.toList());


查看完整回答
反对 回复 2022-05-12
  • 2 回答
  • 0 关注
  • 163 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号