问题描述
在MyService
内,我有以下指令可以产生用分号分隔的用户电子邮件字符串:
users.stream()
.map(UserEntity::getEmail)
.filter(mailValidator.isValid())
.collect(Collectors.joining(";"));
MailValidator
使用Spring注入到MyService
中。这是它的定义:
@Service
public class MailValidator {
private final Pattern mailRegex = Pattern.compile(/** some regular expression */);
public Predicate<String> isValid() {
return mailRegex.asPredicate();
}
}
一切正常。但是,我认为上述MailValidator
在该用例之外没有用。
更准确地说:我可以在字符串流上使用MailValidator
。但是,如何使它在String
上运行呢?
解决方法
您的isValid()
方法返回一些实现Predicate
接口的对象。如果您在Javadocs中检查Predicate,则它具有test(T t)
方法。您要做的就是在输入String上调用该方法。最后看起来可能像这样:
String myStringVariable = "test";
boolean isValid = mailValidator.isValid().test(myStringVariable);
,
您可以使用布尔值返回将签名更改为String参数
class MailValidator {
private final Pattern mailRegex = Pattern.compile("");
public boolean isValid(String s) {
return mailRegex.matcher(s).find();
}
}
并将其与方法参考一起在您的流中使用:
users.stream()
.map(UserEntity::getEmail)
.filter(mailValidator::isValid)
或者,如果您愿意妥协方法的名称,则可以使验证器实现谓词
class MailValidator implements Predicate<String> {
private final Pattern mailRegex = Pattern.compile("");
@Override
public boolean test(String s) {
return mailRegex.matcher(s).find();
}
}
然后就做
users.stream()
.map(UserEntity::getEmail)
.filter(mailValidator)
在此上下文之外,您可以致电
new MailValidator().test("foo")