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

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