当前位置: 首页 > 知识库问答 >
问题:

如何在java对象中搜索空值?

戚云
2023-03-14

我有两个java对象:MyObject和MyObjectDetails

@Data
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
@Builder
public class MyObjectDetails {
    String x;
    long y;
}

@Data
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
@Builder
public class MyObject {
    String a;
    long b;
    String c;
    MyObjectDetails myObjectDetails;
}

搜索空值或空字符串的最佳且简单的方法是什么?

实际上,我正在为这个类使用一个特定的验证器,逐字段检查空值和空字符串

例如,要检查空值,我使用:

private boolean isValidMyObject() {
    boolean isNullValuePresentOnDetails = myObject.getMyObjectDetails() == null ? true : Stream.of(myObject.getMyObjectDetails().getX()).anyMatch(Objects::isNull);
    boolean isNullValuePresentOnMyObject = Stream.of(myObject.getA(), myObject.getC()).anyMatch(Objects::isNull);
    
    boolean isValid = (isNullValuePresentOnDetails || isNullValuePresentOnMyObject) == true ? false : true;
    return isValid;
}

但我也很喜欢将来可以用来制作其他物体的东西。

共有1个答案

阳昊
2023-03-14

您可以使用反射从对象中获取所有返回引用(而不是原语)的getter。然后遍历该列表(或数组,您的选择)并执行它们;当其中任何一个的返回值为null时,返回false或抛出适当的异常。

有点像这样:

public final void validateNonNull( final Object candidate ) throws ValidationException
{
  if( isNull( candidate ) throw new ValidationException( "candidate is null" );

  final var candidateClass = candidate.getClass();
  final List<Method> getters = Arrays.stream( candidateClass.getMethods() ) // getters are always public!
    .filter( m -> !m.getName().equals( "getClass" ) )
    .filter( m -> m.getName().startsWith( "get" ) )
    .filter( m -> m.getParameterCount() == 0 )
    .filter( m -> !m.getReturnType().isPrimitive() )
    .collect( Collectors.toList() );

  for( var method : methods )
  {
    if( isNull( method.invoke( candidate ) ) throw new ValidationException( "candidate.%s() returned null".formatted( method.getName() ) );
  }
}

ValidationException是一个自定义异常,您需要声明为omeo声明的检查异常d::调用

要检查空字符串,也可以像这样更改循环的

…
for( var method : methods )
{
  var retValue = method.invoke( candidate );
  if( retValue instanceof String aString && aString.isEmpty() ) throw new ValidationException( "candidate.%s() returned the empty String".formatted( method.getName() ) ); 
  if( isNull( retValue ) throw new ValidationException( "candidate.%s() returned null".formatted( method.getName() ) );
}

 类似资料:
  • 问题内容: 我有一个对象列表,列表很大。对象是 现在,我必须在列表中搜索对象的特定值。假设 我必须返回那些对象(我的搜索并不总是基于value3) 清单是 有效的方法是什么? 谢谢。 问题答案: 您可以尝试使用Apache Commons Collections。 有一个CollectionUtils类,允许您通过自定义谓词选择或过滤项目。 您的代码将如下所示: 更新: 在 java8中 ,使用

  • 我有一个对象列表,列表很大。对象是 现在我必须在列表中搜索一个对象的特定值。假设我必须返回这些对象(我的搜索不总是基于value3) 该列表为

  • 问题内容: 我有点迷茫,无法做到最快。我有一大堆具有基本变量属性的对象(带有getters / setters方法),我需要在此列表中进行搜索以找到列表中与给定参数匹配的对象 我已经找到了如何进行常规列表搜索的方法,但是我需要进行搜索,例如搜索列表中每个对象的调用getName()的结果的值,并获取结果与我的输入匹配的对象。 如下所示,第三个参数是方法调用的结果,第二个是我要查找的结果。 任何建议

  • 假设mongodb文档(表)“users”为 我想找到1975年必须获得“国家奖章”的人,可能还有其他人在不同的年份获得该奖项。 我怎样才能找到这个人使用奖励类型和年份。所以我可以得到确切的人。

  • 在springboot中,您可以拥有一个

  • 我试图根据用户输入找到一个特定的对象。用户需要输入姓名和性别,然后程序应该搜索ArrayList,查看是否有匹配的姓名和性别。ArrayList中的对象有3个实例变量,但程序只搜索2个。如何在ArrayList中只搜索选定的几个特征? 在我的项目中,我有: 其中,nameList是ArrayList的名称,getName()是返回存储在对象中的名称的方法的名称,getGender()是返回存储在对