使用字符串流的函数不适用于单个字符串?
Function working with stream of string does not work with a single string?
在 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()
方法 returns 一些实现 Predicate
接口的对象。如果您检查 Javadocs 的 Predicate 它有一个 test(T t)
方法。您所要做的就是在您的输入字符串上调用该方法。最后它可能看起来像这样:
String myStringVariable = "test";
boolean isValid = mailValidator.isValid().test(myStringVariable);
您可以使用布尔值将签名更改为字符串参数 return
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)
或者如果你愿意在方法名上妥协,你可以让验证器实现Predicate
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")
在 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()
方法 returns 一些实现 Predicate
接口的对象。如果您检查 Javadocs 的 Predicate 它有一个 test(T t)
方法。您所要做的就是在您的输入字符串上调用该方法。最后它可能看起来像这样:
String myStringVariable = "test";
boolean isValid = mailValidator.isValid().test(myStringVariable);
您可以使用布尔值将签名更改为字符串参数 return
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)
或者如果你愿意在方法名上妥协,你可以让验证器实现Predicate
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")