Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 按字母顺序连接有关字段名称的对象值_Java_Reflection_Java 8_Concatenation_Java Stream - Fatal编程技术网

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