什么是Java 8功能方式来实现类似开关的构造而没有仅使用java.util的“switch”和“if”语句

时间:2017-10-24 13:49:55

标签: java functional-programming

我在不使用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.*语句?

3 个答案:

答案 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)
   );