Dozer,Java:如何将列表<List> 转换为二维数组?
Dozer, Java: How to convert from List<List> to 2D Array?
我有一个列表列表,我正在尝试使用 Dozer 和自定义转换器将其映射到二维数组 [][]。
public class Field {
List<String> items;
public void add(String s) {
items.add(s);
}
}
public class ClassA {
int anotherVariable;
List<Field> fields;
public void add(Field f) {
fields.add(f);
}
}
public class ClassB {
int anotherVariable;
String[][] itemValues;
}
@Test
public void convertListTo2DArray() {
Field field1 = new Field();
field1.add("m"); field1.add("n");
Field field2 = new Field();
field2.add("o"); field2.add("p");
ClassA classA = new ClassA();
classA.add(field1);
classA.add(field2);
classA.setAnotherVariable(99);
List<Converter> converters = new ArrayList<Converter>();
converters.add(new ListToArrayConverter());
ClassB classB = new DozerBeanMapper().setCustomConverters(converters).map(classA, ClassB.class);
/**
* Result:
* classB -> anotherVariable = 99
*
* classB -> itemValues[][] =
* ["m", "n"]
* ["o", "p"]
*/
}
转换器只能用于 List<List>
和 String[][]
之间的转换,不能用于其他变量。
我查看了以下问题的答案,但我应该如何处理该自定义转换器中的数组而不是 Set/List?
如有任何建议,我们将不胜感激。
谢谢
我的java有点生疏,多多包涵
如果您希望转换器仅用于将 List 转换为 String 数组而不用于其他任何内容,您可以限制它的方法之一是仅为 [=30= 中的这两个字段指定自定义转换器]:
<mapping>
<class-a>beans6.ClassA</class-a>
<class-b>beans6.ClassB</class-b>
<field custom-converter="converter.ConvertListToArray">
<a>fields</a>
<b>itemValues</b>
</field>
</mapping>
接下来,需要初始化 Field
class 中的 items
属性和 ClassA
class 中的 fields
属性到 arraylists 以防止它们抛出 NullPointerException
.
List<String> items = new ArrayList<String>();
List<Field> fields = new ArrayList<Field>();
最后,这里是CustomConverter,假设添加到fields
的元素数量始终不变:
public class ConvertListToArray implements CustomConverter{
public Object convert(Object existingDestinationFieldValue, Object sourceFieldValue,
Class<?> destinationClass, Class<?> sourceClass) {
if(sourceFieldValue==null)
return null;
if(sourceFieldValue instanceof List && ((List<?>) sourceFieldValue).size()>0){
List<Field> listOfFields = (List<Field>)sourceFieldValue;
String[][] destinationValue = new String[2][2];
for (int i = 0; i<2;i++){
Field f = listOfFields.get(i);
for (int j = 0;j<f.getItems().size();j++){
destinationValue[i][j] = f.getItems().get(j);
}
}
return destinationValue;
}
return null;
}
}
我有一个列表列表,我正在尝试使用 Dozer 和自定义转换器将其映射到二维数组 [][]。
public class Field {
List<String> items;
public void add(String s) {
items.add(s);
}
}
public class ClassA {
int anotherVariable;
List<Field> fields;
public void add(Field f) {
fields.add(f);
}
}
public class ClassB {
int anotherVariable;
String[][] itemValues;
}
@Test
public void convertListTo2DArray() {
Field field1 = new Field();
field1.add("m"); field1.add("n");
Field field2 = new Field();
field2.add("o"); field2.add("p");
ClassA classA = new ClassA();
classA.add(field1);
classA.add(field2);
classA.setAnotherVariable(99);
List<Converter> converters = new ArrayList<Converter>();
converters.add(new ListToArrayConverter());
ClassB classB = new DozerBeanMapper().setCustomConverters(converters).map(classA, ClassB.class);
/**
* Result:
* classB -> anotherVariable = 99
*
* classB -> itemValues[][] =
* ["m", "n"]
* ["o", "p"]
*/
}
转换器只能用于 List<List>
和 String[][]
之间的转换,不能用于其他变量。
我查看了以下问题的答案,但我应该如何处理该自定义转换器中的数组而不是 Set/List?
如有任何建议,我们将不胜感激。 谢谢
我的java有点生疏,多多包涵
如果您希望转换器仅用于将 List 转换为 String 数组而不用于其他任何内容,您可以限制它的方法之一是仅为 [=30= 中的这两个字段指定自定义转换器]:
<mapping>
<class-a>beans6.ClassA</class-a>
<class-b>beans6.ClassB</class-b>
<field custom-converter="converter.ConvertListToArray">
<a>fields</a>
<b>itemValues</b>
</field>
</mapping>
接下来,需要初始化 Field
class 中的 items
属性和 ClassA
class 中的 fields
属性到 arraylists 以防止它们抛出 NullPointerException
.
List<String> items = new ArrayList<String>();
List<Field> fields = new ArrayList<Field>();
最后,这里是CustomConverter,假设添加到fields
的元素数量始终不变:
public class ConvertListToArray implements CustomConverter{
public Object convert(Object existingDestinationFieldValue, Object sourceFieldValue,
Class<?> destinationClass, Class<?> sourceClass) {
if(sourceFieldValue==null)
return null;
if(sourceFieldValue instanceof List && ((List<?>) sourceFieldValue).size()>0){
List<Field> listOfFields = (List<Field>)sourceFieldValue;
String[][] destinationValue = new String[2][2];
for (int i = 0; i<2;i++){
Field f = listOfFields.get(i);
for (int j = 0;j<f.getItems().size();j++){
destinationValue[i][j] = f.getItems().get(j);
}
}
return destinationValue;
}
return null;
}
}