0

我有一个List<Staff>从数据库获取这些值的地方。我需要找到将是动态的特定字段的最大字符大小。现在我能够获得 firstName 的最大大小,但它的类型是硬编码的,如下所示。

 public class Staff {

    private String firstName;
    private String lastName;
    private String surName;
    private String mailId;
}

List<String> fields = Arrays.asList("firstName", "lastName", "surName");
List<Staff> staffList = staffRepository.findAll();

fields.stream.map(field ->
Long maxLength = staffList.stream()
.map(Staff::getFirstName()) // i need to pass the field which will be dynamically changing
.mapToInt(String::length)
.max()).mapToLong(max -> max.orElse(0)).sum()
4

1 回答 1

1

如该线程中所述,有多种访问属性值的方法

所以基本上,你可以写这样的东西来访问价值

private static Optional<Method> getMethodForField(Class clazz, String fieldName) throws IntrospectionException {
return Arrays.stream(Introspector.getBeanInfo(clazz).getPropertyDescriptors())
  .filter(propertyDescriptor -> propertyDescriptor.getName().equalsIgnoreCase(fieldName))
  .findFirst()
  .map(PropertyDescriptor::getReadMethod);

}

然后访问字段的长度,创建另一个方法

private static int getFieldLength(Staff staff, Method readMethod)  {
try {
  return ((String) readMethod.invoke(staff)).length();
} catch(Exception e){ }
return 0;

}

现在终于编写代码来计算最大值。

Optional<Method> readMethod = getMethodForField(Staff.class, "firstName");

if (readMethod.isPresent()) {
   staffList.stream()
    .mapToInt(data -> getFieldLength(data, readMethod.get()))
    .max();
}

您可以将其包装在方法中并遍历字段以计算所有字段的最大值。

于 2020-05-01T14:10:24.057 回答