我想知道是否可以制作switch statement
来检查输入的字符串 中是否存在 子字符串?
我的意思是:
答案 0 :(得分:4)
虽然没有这样的构造,但是如果真的想要,你可以使用Java-8 lambdas创建类似的东西。不是我建议你这样做,只是一个概念验证:
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!"
。
答案 1 :(得分:0)
你的意思是这样吗?
void findSubstring(String s) {
String lower = s.toLowerCase();
switch (lower) {
case "subStringToFind" :
doSomething();
break;
}
}
或者您希望ConstantExpression成为boolean
?这不起作用,因为您正在启用String
。
答案 2 :(得分:0)
如果你不害怕潜入某些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。 Java的匹配基础
干杯, 斯蒂芬