我在不使用if语句和创建自己的功能API的情况下编写了下一个代码。 它会检查一些情况。
import java.util.*;
public class Test {
public static void main(String[] args) {
String smth = new Random().nextBoolean() ? "something" : null;
Optional.ofNullable(smth)
.filter(i -> !i.isEmpty())
.<Runnable>map(i -> () -> System.out.println("Success " + i))
.orElse(() -> System.out.println("error"))
.run();
}
}
如何仅使用switch
实现java.util.*
语句?
答案 0 :(得分:3)
简单化:
new Runnable[] {
() -> System.out.println("0"),
() -> System.out.println("1"),
() -> System.out.println("2")
}[i].run();
已经有用:
Map<String, Runnable> map = ImmutableMap.<String, Runnable>builder()
.put("0", () -> System.out.println("0"))
.put("1", () -> System.out.println("1"))
.build();
map.getOrDefault("2", () -> System.out.println("rest")).run();
然而,对于使用功能样式编程,最好尝试一种功能强大的编程语言。
答案 1 :(得分:1)
在函数式编程中,与pattern matching
的关系很紧密,我想你想要实现这一点。到目前为止,标准Java 8并不支持这种功能。但是,它已经在讨论如何在未来实现它 - 看看at the document from Brian Goetz。
与此同时,您可以查看此blog,它使用VAVR,这是一个便于模式匹配的库。所以在你的情况下,它看起来像这样:
import java.util.*;
public class Test {
public static void main(String[] args) {
String smth = new Random().nextBoolean() ? "something" : null;
String result = Match(smth).of(
Case($(isNull()), "Success " + smth),
Case($(isNotNull()), "error"));
}
}
答案 2 :(得分:0)
JMPL是一个简单的Java库,可以使用Java 8功能来模拟某些功能模式匹配。 该库支持许多模式,这些模式可以用多种语言显示,例如C#,Scala,Rust,Swift。
matches(data).as(
new Person("man"), () -> System.out.println("man");
new Person("woman"), () -> System.out.println("woman");
new Person("child"), () -> System.out.println("child");
Null.class, () -> System.out.println("Null value "),
Else.class, () -> System.out.println("Default value: " + data)
);
matches(data).as(
Integer.class, i -> { System.out.println(i * i); },
Byte.class, b -> { System.out.println(b * b); },
Long.class, l -> { System.out.println(l * l); },
String.class, s -> { System.out.println(s * s); },
Null.class, () -> { System.out.println("Null value "); },
Else.class, () -> { System.out.println("Default value: " + data); }
);
matches(figure).as(
Rectangle.class, (int w, int h) -> System.out.println("square: " + (w * h)),
Circle.class, (int r) -> System.out.println("square: " + (2 * Math.PI * r)),
Else.class, () -> System.out.println("Default square: " + 0)
);