使用字符串流的函数不能使用单个字符串?

问题描述

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")