Java 按字母顺序连接有关字段名称的对象值
我正在寻找一种方法来按字母顺序连接关于字段名称的对象值 例如:Java 按字母顺序连接有关字段名称的对象值,java,reflection,java-8,concatenation,java-stream,Java,Reflection,Java 8,Concatenation,Java Stream,我正在寻找一种方法来按字母顺序连接关于字段名称的对象值 例如: public Class Request { private String number; private String amount; private String currency; } Request request = new Request(); request.setNumber("tata"); request.setCurrency("toto"); 这样,我的方法应该返回totota 方
public Class Request {
private String number;
private String amount;
private String currency;
}
Request request = new Request();
request.setNumber("tata");
request.setCurrency("toto");
这样,我的方法应该返回totota
方法必须是泛型的:
public static String concatenate(Object object) { ...}
null
值不能串联
我已经检查了Apache Commons BeanUtils和Java 8 streams,但没有发现什么好东西。您可以通过迭代给定对象中所有声明的字段来编写
public static String concatenate(Object object) {
return Arrays.stream(object.getClass().getDeclaredFields())
.filter(f -> f.getType() == String.class)
.sorted(Comparator.comparing(Field::getName))
.map(f -> {
try { return (String)f.get(object); }
catch (IllegalAccessException e) { return null; }
})
.filter(Objects::nonNull)
.collect(Collectors.joining());
}
可以通过迭代给定对象中所有声明的字段来编写
public static String concatenate(Object object) {
return Arrays.stream(object.getClass().getDeclaredFields())
.filter(f -> f.getType() == String.class)
.sorted(Comparator.comparing(Field::getName))
.map(f -> {
try { return (String)f.get(object); }
catch (IllegalAccessException e) { return null; }
})
.filter(Objects::nonNull)
.collect(Collectors.joining());
}
谢谢你安德鲁·托比尔科,我在做这个(工作)
公共静态字符串按字母顺序连接(对象){
Map=null;
试一试{
地图=小动物。描述(对象);
}catch(IllegalAccessException | InvocationTargetException | NoSuchMethodException){
e、 printStackTrace();
}
//删除从BeanUtils.description生成的类属性
地图。删除(“类别”);
map.values().removeAll(Collections.singleton(null));
Map treeMap=新的treeMap(Map);
返回treeMap.values().stream().collect(Collectors.joining());
}
但是我不喜欢这样使用小坚果,我更喜欢你的方法
我只添加了f.setAccessible(true);要访问私有字段谢谢你安德鲁·托比尔科,我正在这样做(工作)
公共静态字符串按字母顺序连接(对象){
Map=null;
试一试{
地图=小动物。描述(对象);
}catch(IllegalAccessException | InvocationTargetException | NoSuchMethodException){
e、 printStackTrace();
}
//删除从BeanUtils.description生成的类属性
地图。删除(“类别”);
map.values().removeAll(Collections.singleton(null));
Map treeMap=新的treeMap(Map);
返回treeMap.values().stream().collect(Collectors.joining());
}
但是我不喜欢这样使用小坚果,我更喜欢你的方法
我只添加了f.setAccessible(true);要访问私有字段您到目前为止尝试了什么?既然“o”在“a”之后,为什么它会返回“totata”而不是“tatoto”?@nickzoum它是基于字段名的。您只想处理
字符串
字段吗?还是所有参考字段?还是所有字段,包括基本字段?您希望如何处理数组/列表/集合字段?您想要超类中的字段吗?如果继承层次结构中有多个同名字段呢?(我想你需要考虑一下你的需求,然后自己试一试)在我的例子中,所有对象都只有字符串字段,你到目前为止都尝试了什么?既然“o”在“a”之后,为什么它会返回“totota”而不是“tatatoto”?@nickzoum它基于字段名。你只想处理String
字段吗?还是所有参考字段?还是所有字段,包括基本字段?您希望如何处理数组/列表/集合字段?您想要超类中的字段吗?如果继承层次结构中有多个同名字段呢?(我认为您需要考虑一下您的需求;然后自己试一试)在我的情况下,所有对象都只有字符串字段为什么这么复杂?当您想进行类型比较时,例如.filter(f->f.getType()==String.class)
,为什么不进行类型比较呢?您可以使用.sorted(Comparator.comparing(Field::getName))
。与手动创建StringBuilder
和使用臭名昭著的forEach
不同,只需使用.collect(Collectors.joining())
就可以了……顺便说一句,这个方法不需要声明抛出IllegaccessException
。为什么这么复杂?当您想进行类型比较时,例如.filter(f->f.getType()==String.class)
,为什么不进行类型比较呢?您可以使用.sorted(Comparator.comparing(Field::getName))
。而不是手动创建一个StringBuilder
并使用臭名昭著的forEach
,只需使用.collector(Collectors.joining())
,就可以达到这个目的……顺便说一句,这个方法不需要声明抛出IllegaccessException
…