如何将可为空的字符串与一个表达式中的多个值进行比较?

时间:2018-08-10 12:14:03

标签: java string java-8 java-stream

对于非null字符串,好的解决方案是:

Stream.of("REG", "UNREG").anyMatch(str::equals)

从这里来:Compare one String with multiple values in one expression

但是如何修改(或更改)可为空的字符串(如果字符串为null返回false)?

3 个答案:

答案 0 :(得分:4)

您可能想改用Optional开头,并在Optional::map方法内执行Stream。如果没有结果(str为null),则根据请求返回false

Optional.ofNullable(str)
        .map(string -> Stream.of("REG", "UNREG")         // Your Stream as at your snippet
                             .anyMatch(string::equals))  // Returns if the str matches any
        .orElse(false);                                  // Returns false if str is null

不要小看简单的东西:

str != null && Stream.of("REG", "UNREG").anyMatch(str::equals);

如果第一个表达式为false(当strnull时),表达式的第二部分将不被求值,因此永远不会在{{1}内的NPE上失败}。

答案 1 :(得分:2)

最简单的解决方案是使用Arrays.asList + List.contains

Arrays.asList("REG", "UNREG").contains(str)

请注意:

  1. 在此解决方案和基于Stream的解决方案中,都只有一个数组分配。
  2. 但是,这种方法仅对常规equals有意义(因此此处无法使用equalsIgnoreCase进行比较)。

答案 2 :(得分:0)

为什么不仅仅颠倒equals子句:

boolean contained = Stream.of("REG", "UNREG").anyMatch(s -> s.equals(str));

因此,如果strnull,它将与流中的任何String不匹配,因此返回false