Java与C#'的等价物;s';可枚举。任何';

Java与C#'的等价物;s';可枚举。任何';,java,if-statement,string-search,Java,If Statement,String Search,在C#中,有一种方法可以通过使用Enumerable来减少if语句的长度。任何都可以检查序列中的元素是否满足条件() 例如,而不是: If ( string.Contains(">") || string.Contains("<") || string.Contains("&") || string.Contains("l") || string.Contains("p") ) If(string.Contains(“>”)| | string.Contains(“”,”使

在C#中,有一种方法可以通过使用
Enumerable来减少if语句的长度。任何
都可以检查序列中的元素是否满足条件()

例如,而不是:

If ( string.Contains(">") || string.Contains("<") || string.Contains("&") || string.Contains("l") || string.Contains("p") )

If(string.Contains(“>”)| | string.Contains(“”,”使用Java 8,您可以编写如下内容:

if (Stream.of(">", "<", "&", "l", "p").anyMatch(string::contains)) {
  ...
}
代码:

@State(Scope.Benchmark)
@基准模式(模式平均时间)
公共类SO30940682{
@参数({“>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,
“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;
@基准公共布尔流(){

返回流。对于使用Java 8的(“>”,“|,可以使用以下方法:


if(Stream.of(“>”,“如果没有Java8,您可以使用正则表达式来完成任务

string.matches(“^.*?(| p | 1 |&.*$”)
应该可以做到这一点

编辑:


我想知道哪个解决方案执行得更快。即使JIT可以内联所有lambda goodness,
(s)可能比使用正则表达式慢。我可能完全错了,我希望Java 8的忠实拥护者能对此有所了解。

看起来像是做了你想做的。

@marcocierno String::contains引用一个不存在的静态方法。不好,我删除了注释。我错过了
String
是一个静态方法的事实变量谢谢澄清。我想知道正则表达式检查子字符串是否比检查单个字符更快。我不确定
是否包含()
在这些情况下性能很好。谢谢。这是一个完美的解决方案。如果人们不使用JAVA 8,Bruce Wayne使用正则表达式的解决方案可能会很有用。如果你真的想提高速度并只检查单个字符,你就要检查字符串中所有字符的单个循环中的所有几个字符。我想知道我的速度有多快与其他方法相比…只是为了完整性:您还可以使用
.Any(string.Contains)
而不是更详细的
.Any(w=>string.Contains(w))
在C#中。
if (Stream.of(">", "<", "&", "l", "p").anyMatch(string::contains)) {
  ...
}
Benchmark                                    (s)  Mode  Samples     Score    Error  Units
c.a.p.SO30940682.stream   >aaaaaaaaaaaaaaaaaaaaa  avgt       10    49.942 ±  1.936  ns/op
c.a.p.SO30940682.stream   aaaaaaaaaaaaaaaaaaaaa>  avgt       10    54.263 ±  1.927  ns/op
c.a.p.SO30940682.stream   aaaaaaaaaaaaaaaaaaaaap  avgt       10   131.537 ±  4.908  ns/op
c.a.p.SO30940682.stream   paaaaaaaaaaaaaaaaaaaaa  avgt       10   129.528 ±  7.352  ns/op
c.a.p.SO30940682.regex    >aaaaaaaaaaaaaaaaaaaaa  avgt       10   649.867 ± 27.142  ns/op
c.a.p.SO30940682.regex    aaaaaaaaaaaaaaaaaaaaa>  avgt       10  1047.122 ± 89.230  ns/op
c.a.p.SO30940682.regex    aaaaaaaaaaaaaaaaaaaaap  avgt       10  1029.710 ± 61.055  ns/op
c.a.p.SO30940682.regex    paaaaaaaaaaaaaaaaaaaaa  avgt       10   694.309 ± 32.675  ns/op
@State(Scope.Benchmark)
@BenchmarkMode(Mode.AverageTime)
public class SO30940682 {

  @Param({">aaaaaaaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaaaaaaa>",
          "aaaaaaaaaaaaaaaaaaaaap", "paaaaaaaaaaaaaaaaaaaaa"}) String s;

  @Benchmark public boolean stream() {
    return Stream.of(">", "<", "&", "l", "p").anyMatch(s::contains);
  }

  @Benchmark public boolean regex() {
    return s.matches("^.*?(>|<|&|l|p).*$");
  }
}
if (Stream.of(">", "<", "&", "l", "p").anyMatch(w -> string.contains(w))) {

}