有没有办法将布尔谓词应用于Java中的一组对象属性

DaB*_*ick 1 java lambda java-stream method-reference

我想知道是否有一种更优雅的方式来编写以下代码,它利用了一些流,lambdas和方法引用的组合:

final boolean valid = StringUtils.hasText(obj.getFirstName())
                && StringUtils.hasText(obj.getLastName())
                && StringUtils.hasText(obj.getGender())
                && StringUtils.hasText(obj.getDob());
Run Code Online (Sandbox Code Playgroud)

理想情况下,它看起来像这样:

final boolean valid =
       something(StringUtil::hasText, 
                 obj.getFirstName(),
                 obj.getLastName(),
                 obj.getGender(),
                 obj.getDob());
Run Code Online (Sandbox Code Playgroud)

也许:

final boolean valid =
       something(StringUtil::hasText, obj,
                 Type::getFirstName(),
                 Type::getLastName(),
                 Type::getGender(),
                 Type::getDob());
Run Code Online (Sandbox Code Playgroud)

显然你可以把所有的getter放到List中,然后使用一个流,但这看起来很罗嗦.在我看来,可能有库函数在JRE中或者在Spring或Apache中执行类似的操作.

Ous*_* D. 5

使用其他任何东西,但你当前的方法只是让事情变得更糟.即使你要创建一个方法来执行"和"逻辑给定一些输入参数,你最终将会得到相同数量的代码,如果不是更多,肯定会更少的内存友好.

您可以使用allMatch评论中建议的内容:

Stream.of(obj.getFirstName(), obj.getLastName(), obj.getGender(), obj.getDob())
      .allMatch(StringUtils::hasText)
Run Code Online (Sandbox Code Playgroud)

但是你可以看到这更复杂,更不易阅读.

结论是我不会用你当前的方法改变一件事.如果您不得不多次执行此检查,那么您可能需要退后一步并重新考虑您的设计.

  • 如果可以的话,我会不止一次地投票. (3认同)