使用 Switch 语句检查字符串中的子字符串
Check for a Substring in a String with a Switch Statement
我想知道是否可以制作一个 switch statement
来检查输入的字符串中是否有 子字符串?
我的意思是:
- 你在控制台输入一个字符串
- 字符串被修改为全部小写字母以便于检查
- switch 语句检查字符串是否包含某个子字符串
你的意思是这样的吗?
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
干杯,
斯蒂芬
我想知道是否可以制作一个 switch statement
来检查输入的字符串中是否有 子字符串?
我的意思是:
- 你在控制台输入一个字符串
- 字符串被修改为全部小写字母以便于检查
- switch 语句检查字符串是否包含某个子字符串
你的意思是这样的吗?
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
干杯, 斯蒂芬