
本文介绍了如何使用Java将一个包含嵌套列表的对象列表进行转换,生成一个新的列表,其中每个对象在其嵌套列表中仅包含一个元素。文章提供了三种不同的实现方式,分别适用于Java 7及更早版本、Java 8至Java 15以及Java 16及更高版本,并详细解释了每种方法的实现原理和适用场景。
在Java开发中,经常会遇到需要对数据进行转换和处理的场景。其中一种常见的场景是,我们需要将一个包含嵌套列表的对象列表进行转换,生成一个新的列表,其中每个对象在其嵌套列表中仅包含一个元素。例如,我们有如下两个类:
public class A {
String a;
String b;
String v;
List pmtList;
}
public class Pmt {
String id;
String b;
List trList;
} 我们希望将A对象中的pmtList进行转换,生成一个新的pmtList,其中每个Pmt对象仅包含一个Transaction对象。本文将介绍如何使用Java实现这种转换。
Java 7 及更早版本
对于Java 7及更早版本,我们可以使用传统的循环来实现这个转换。
立即学习“Java免费学习笔记(深入)”;
Listlist = new ArrayList<>(); pmtList.forEach(p -> p.getTrList().forEach(tr -> list.add(new Pmt(p.getId(), p.getB(), Collections.singletonList(tr)))));
这段代码首先创建一个新的ArrayList来存储转换后的Pmt对象。然后,它遍历原始的pmtList中的每个Pmt对象,并进一步遍历每个Pmt对象中的trList。对于每个Transaction对象,它创建一个新的Pmt对象,并将该Transaction对象放入一个只包含一个元素的列表中,然后将新的Pmt对象添加到结果列表中。注意这里使用了Collections.singletonList(tr)来创建一个只包含一个元素的List,避免直接使用new ArrayList(tr),因为这样会创建一个包含tr所有属性的List,而不是只包含tr本身的List。
Java 8 - Java 15
对于Java 8及更高版本,我们可以使用Stream API来实现这个转换,使代码更加简洁和易读。
import java.util.stream.Collectors; Listlist = pmtList.stream() .flatMap(p -> p.getTrList() .stream() .map(tr -> new Pmt(p.getId(), p.getB(), Collections.singletonList(tr)))) .collect(Collectors.toList());
这段代码使用stream()方法将pmtList转换为一个Stream。然后,它使用flatMap()方法将每个Pmt对象中的trList转换为一个Stream,并将每个Transaction对象映射为一个新的Pmt对象,其中包含该Transaction对象。最后,它使用collect(Collectors.toList())方法将Stream转换为一个List。flatMap操作符在这里起到了关键作用,它将多个Stream合并为一个Stream,避免了嵌套循环。
Java 16 及更高版本
Java 16引入了mapMulti()方法,可以更简洁地实现这个转换。
import java.util.function.Consumer; Listlist = pmtList.stream() .mapMulti((Pmt p, Consumer c) -> { p.getTrList().forEach(tr -> c.accept(new Pmt(p.getId(), p.getB(), Collections.singletonList(tr)))); }) .toList();
这段代码使用mapMulti()方法将每个Pmt对象转换为多个Pmt对象。mapMulti()方法接受一个BiConsumer作为参数,该BiConsumer接受一个Pmt对象和一个Consumer
注意事项
- 在创建新的Pmt对象时,需要确保复制原始Pmt对象的其他属性,例如id和b。
- 如果Transaction对象是可变的,需要确保在创建新的Pmt对象时,复制Transaction对象,以避免修改原始Transaction对象。
- 在使用Stream API时,需要注意性能问题。如果列表非常大,可以考虑使用并行Stream来提高性能。
总结
本文介绍了如何使用Java将一个包含嵌套列表的对象列表进行转换,生成一个新的列表,其中每个对象在其嵌套列表中仅包含一个元素。文章提供了三种不同的实现方式,分别适用于Java 7及更早版本、Java 8至Java 15以及Java 16及更高版本。选择哪种实现方式取决于你使用的Java版本和个人偏好。希望本文能够帮助你更好地理解和使用Java进行数据转换。










