我是Java新手,所以我想知道是否可以创建一个switch语句来检查输入字符串中是否存在子字符串?我的意思是你在控制台中输入一个字符串,然后为了便于检查而使字符串的副本全部小写,最后一个switch语句检查字符串是否包含某个子字符串。使用switch语句检查字符串中的子字符串
谢谢。
我是Java新手,所以我想知道是否可以创建一个switch语句来检查输入字符串中是否存在子字符串?我的意思是你在控制台中输入一个字符串,然后为了便于检查而使字符串的副本全部小写,最后一个switch语句检查字符串是否包含某个子字符串。使用switch语句检查字符串中的子字符串
谢谢。
虽然没有这样的结构,但使用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!"
。
你的意思是这样的吗?
void findSubstring(String s) {
String lower = s.toLowerCase();
switch (lower) {
case "subStringToFind" :
doSomething();
break;
}
}
还是你想的ConstantExpression成为boolean
?这是行不通的,因为你打开String
。
如果您不怕潜入一些Java 8 lambda并与javaslang结合使用,那么就存在一个干净的解决方案。 (javaslang) 下面发布的例子,验证使用javaslang案例谓词的子字符串:
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快照。看看文档javaslang docs 寻找
3.6.1。匹配的为Java
干杯, 基础知识斯蒂芬
不,你必须与正常不过的事情吧'if'语句。 –
也许你会发现'String.contains()'方法更容易使用? –
这将是一个矛盾的事实,即'switch'必须选择一个'case'语句而没有歧义。 *匹配*一个字符串的字符串不能匹配不同的大小写,但是包含*一个子字符串的字符串可以包含另一个没有问题的子字符串... – Holger