java - 有没有办法将布尔谓词应用于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 中。
解决方案
除了您当前的方法之外,使用其他任何方法只会让事情变得更糟。即使您要创建一个方法来在给定一些输入参数的情况下执行“与”逻辑,您最终也会得到相同数量的代码,如果不是更多的话,而且肯定会减少内存友好性。
您可以allMatch
按照评论中的建议使用:
Stream.of(obj.getFirstName(), obj.getLastName(), obj.getGender(), obj.getDob())
.allMatch(StringUtils::hasText)
但正如你所看到的,这要复杂得多,可读性也差。
结论是我不会用你目前的方法改变任何事情。如果您必须多次执行此检查,那么您可能需要退后一步重新考虑您的设计。
推荐阅读
- python - 如何使用 nltk 或 python 删除或更正 excel 文件或文本文件中的拼写错误
- business-intelligence - 具有收入排序功能的总部位置彭博终端筛选器
- android - 如何将Web api中的数据填充到android中的自定义listView中
- php - 无法从 Facebook 登录中检索电子邮件
- c++ - 如果类使用虚拟继承,为什么对象大小会增加?
- c# - 我收到 NullReferenceException 错误,但我不知道为什么?
- c++ - C++ 环境/IDE 避免多次读取大数据集
- javascript - 动态填充复选框并动态设置其选中状态
- vagrant - Vagrant 无法在 macOS High Sierra 上的浏览器中访问服务器
- vue.js - 没有模板绑定的 VueJs 计算属性