首页 > 解决方案 > 有没有办法将布尔谓词应用于Java中的一组对象属性

问题描述

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

final boolean valid = StringUtils.hasText(obj.getFirstName())
                && StringUtils.hasText(obj.getLastName())
                && StringUtils.hasText(obj.getGender())
                && StringUtils.hasText(obj.getDob());

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

final boolean valid =
       something(StringUtil::hasText, 
                 obj.getFirstName(),
                 obj.getLastName(),
                 obj.getGender(),
                 obj.getDob());

也许:

final boolean valid =
       something(StringUtil::hasText, obj,
                 Type::getFirstName(),
                 Type::getLastName(),
                 Type::getGender(),
                 Type::getDob());

显然,您可以将所有 getter 放入 List 中,然后使用流,但这似乎很罗嗦。在我看来,可能有库函数可以做这样的事情,无论是在 JRE 中,还是在 Spring 或 Apache 中。

标签: javalambdajava-streammethod-reference

解决方案


除了您当前的方法之外,使用其他任何方法只会让事情变得更糟。即使您要创建一个方法来在给定一些输入参数的情况下执行“与”逻辑,您最终也会得到相同数量的代码,如果不是更多的话,而且肯定会减少内存友好性。

您可以allMatch按照评论中的建议使用:

Stream.of(obj.getFirstName(), obj.getLastName(), obj.getGender(), obj.getDob())
      .allMatch(StringUtils::hasText)

但正如你所看到的,这要复杂得多,可读性也差。

结论是我不会用你目前的方法改变任何事情。如果您必须多次执行此检查,那么您可能需要退后一步重新考虑您的设计。


推荐阅读