使用 Switch 语句检查字符串中的子字符串

Check for a Substring in a String with a Switch Statement

我想知道是否可以制作一个 switch statement 来检查输入的字符串中是否有 子字符串

我的意思

你的意思是这样的吗?

void findSubstring(String s) {
  String lower = s.toLowerCase();
  switch (lower) {
    case "subStringToFind" : 
      doSomething();
      break;
  }
}

或者您希望 ConstantExpression 成为 boolean?那是行不通的,因为你打开了 String.

虽然没有这样的构造,但如果您真的想要,可以使用 Java-8 lambda 来创建类似的东西。并不是我建议你这样做,只是一个概念验证:

public class SwitchSubstring {
    private static final SwitchSubstring DONE = new SwitchSubstring(null) {
        @Override
        public SwitchSubstring when(String subString, Runnable r) {
            return this;
        }

        @Override
        public void orElse(Runnable r) {
        }
    };

    private final String str;

    private SwitchSubstring(String str) {
        this.str = str;
    }

    public SwitchSubstring when(String subString, Runnable r) {
        if(str.contains(subString)) {
            r.run();
            return DONE;
        }
        return this;
    }

    public void orElse(Runnable r) {
        r.run();
    }

    public static SwitchSubstring of(String str) {
        return new SwitchSubstring(str);
    }
}

用法示例:

SwitchSubstring.of("some test string")
    .when("foo", () -> System.out.println("Foo is there!"))
    .when("bar", () -> System.out.println("Bar is there!"))
    .when("test", () -> System.out.println("Test is there!"))
    .orElse(() -> System.out.println("Nothing found"));

打印 "Test is there!".

如果您不害怕深入研究 Java 8 个 lambda 并结合 javaslang,那么存在一个干净的解决方案。 (javaslang) 下面发布的示例使用 javaslang Case 谓词验证子字符串:

import org.junit.Test;
import java.util.function.Predicate;
import static javaslang.API.*;
public class JavaSlangSwitchCase {

  @Test
  public void javaSlangSwitchCaseWithSubstringAB() throws Exception {
    Match("BlahABBlah").of(
        Case(contains("AB"), o -> run(this::printHasAB)),
        Case(contains("CD"), o -> run(this::printHasCD)),
        Case($(), o -> run(() -> {
          System.out.println("KABOOM!");
        }))
    );
  }

  @Test
  public void javaSlangSwitchCaseWithSubstringCD() throws Exception {
    Match("BlahCDBlah").of(
        Case(contains("AB"), o -> run(this::printHasAB)),
        Case(contains("CD"), o -> run(this::printHasCD)),
        Case($(), o -> run(() -> {
          System.out.println("KABOOM!");
        }))
    );
  }

  private void printHasAB() {
    System.out.println("Has AB");
  }

  private void printHasCD() {
    System.out.println("Has CD");
  }

  public static <T> Predicate<T> contains(T value) {
    return (obj) -> ((String)obj).contains((String) value);
  }
}

我使用 javaslang 2.10-SNAPSHOT。查看 javaslang docs 的文档 寻找

3.6.1. The Basics of Match for Java

干杯, 斯蒂芬