Java 如何在一个表达式中将可空字符串与多个值进行比较?
非Java 如何在一个表达式中将可空字符串与多个值进行比较?,java,string,java-8,java-stream,Java,String,Java 8,Java Stream,非null字符串的好解决方案是: Stream.of("REG", "UNREG").anyMatch(str::equals) 从这里取: 但是如何修改(或更改)可为null的字符串(如果字符串为null返回false)?您可能希望改为从Optional开始,并在方法内执行流。如果不存在结果(str为null),则根据请求返回false: Optional.ofNullable(str) .map(string -> Stream.of("REG", "UNREG")
null
字符串的好解决方案是:
Stream.of("REG", "UNREG").anyMatch(str::equals)
从这里取:
但是如何修改(或更改)可为null的字符串(如果字符串为
null
返回false
)?您可能希望改为从Optional
开始,并在方法内执行流。如果不存在结果(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
(当str
为null
)时,表达式的第二部分将不会被计算,因此在Stream::anyMatch的NPE中永远不会失败。您可能希望改为从Optional
开始,并在方法内执行流。如果不存在结果(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
(当str
为null
)时,表达式的第二部分将不会被计算,因此在Stream::anyMatch
的NPE中永远不会失败,最简单的解决方案是使用+:
请注意:
在这个和基于流的解决方案中,都有一个单独的数组分配
然而,这种方法仅适用于常规的等于(因此,此处不可能使用例如进行比较)
最简单的解决方案是使用+:
请注意:
在这个和基于流的解决方案中,都有一个单独的数组分配
然而,这种方法仅适用于常规的等于(因此,此处不可能使用例如进行比较)
为什么不将equals
子句倒置:
boolean contained = Stream.of("REG", "UNREG").anyMatch(s -> s.equals(str));
因此,如果str
为null
它将不匹配流中的任何字符串
s,因此返回false为什么不反转equals
子句:
boolean contained = Stream.of("REG", "UNREG").anyMatch(s -> s.equals(str));
因此,如果str
为null
它将不匹配流中的任何字符串,因此返回false
你的意思是什么?str有什么问题吗null&&Stream.of(“REG”…
?或.anyMatch(s->s.equals(str))
如果您确定流中的字符串不是null到zapl-thanx!@DodgyCodeException,它已经存在于Java 9中,并且这些不可变集合不支持null
,甚至不支持包含(null)
,这是与其他集合的基本区别之一。你是什么意思?str!=null&&Stream.of(“REG”…
?或。anyMatch(s->s.equals(str))有什么问题
如果您确定流中的字符串不是nullto zapl-thanx!@DodgyCodeException,则它已经在Java 9中,并且这些不可变集合不支持null
,甚至不支持包含(null)
,这是与其他集合的基本区别之一。您对过滤器的调用没有效果,也没有必要。@DodgyCodeException:您是对的,只有当值存在时才会应用可选::map
。我已经更正了它,谢谢。您对过滤器的调用没有效果,也没有必要。@DodgyCodeException:You's right,Optional::map
仅在值存在时应用。我已经更正了它,谢谢。这不同于要求“如果字符串为null
返回false
”,因为包含(null)如果存在null
元素,则可以返回true
。如果允许返回true
的要求str
为null
且Stream
具有null
元素,Stream.of(…)。anyMatch(Predicate.isEqual(str))
将是另一种选择。好吧,你从字面上理解了这个要求。我相信OP并不意味着,因为这种行为(null
这里和null
那里返回false
)将非常不直观。是的,我从字面上理解它(就像尼古拉斯的回答)如我所说,如果要匹配null
元素,也可以使用.anyMatch(Predicate.isEqual(str))
如果您已经有一个现有的流,并且无法重写代码来生成一个集合alaarray.asList
。那么我们对字符串的来源做了不同的假设。我假设OP寻找一个习惯用法来测试编译时已知的几个字符串的相等性,比如if(“REG.equals(str)| |“unrel.equals(str))
->if(Arrays.asList(“REG”、“unrel”).contains(str))
。实际上,现在我已经看过了,这似乎是他想要的。但是如果他从其他来源获得字符串
,基于流
的解决方案确实会更好。这与要求“如果字符串为null
返回false
”不同,因为包含(null)如果存在null
元素,则可以返回true
。如果允许返回true
的要求str
为null
且Stream
具有null
元素,Stream.of(…)。anyMatch(Predicate.isEqual(str))
将是另一种选择。好吧,你从字面上理解了这个要求。我相信OP并不意味着,因为这种行为(null
这里和null
那里返回false
)将非常不直观。是的,我从字面上理解它(就像尼古拉斯的回答)如我所说,如果要匹配null
元素,也可以使用.anyMatch(Predicate.isEqual(str))
如果您已经有一个现有流,并且无法重写代码来生成集合ala