2014-10-31 20 views
4

假设我想要创建一组相关的函数并想将它们组合到一个枚举中。是否可以使用lambda表示一个函数enum的实现?

我可以代码,只需例如:

enum Case implements Function<Object, String> { 
    UPPER { 
     public String apply(Object o) { 
      return o.toString().toUpperCase(); 
     } 
    }, 
    LOWER { 
     public String apply(Object o) { 
      return o.toString().toLowerCase(); 
     } 
    } 
} 

我希望能够作为一个lambda,喜欢的东西实现代码(但不编译):

enum CaseLambda implements Function<Object, String> { 
    UPPER (o -> o.toString().toUpperCase()), 
    LOWER (o -> o.toString().toLowerCase()) 
} 

我已经尝试了一些括号等变体,但没有编译。

是否有一种语法允许将枚举实例声明为lambda?

+0

我很好奇编译错误是什么。 – Radiodef 2014-10-31 00:26:44

+4

你可以在枚举中声明一个'Function '字段,将它传递给构造函数,并像第二个代码段中那样调用构造函数吗?或者这是太多的样板? – yshavit 2014-10-31 00:26:53

+0

@yshavit这就是我认为他正在尝试做的第二个片段。 (也许我的假设是错误的,但是。) – Radiodef 2014-10-31 00:28:45

回答

12

不,enum constant syntax不允许。如果你用一个物体声明一个常量,那么这个物体是classbody

yshavit's suggestion看起来合适。代表执行Function

enum Case implements Function<Object, String> { 
    UPPER (o -> o.toString().toUpperCase()), 
    LOWER (o -> o.toString().toLowerCase()); 

    private final Function<Object, String> func; 

    private Case(Function<Object, String> func) { 
     this.func = func; 
    } 

    @Override 
    public String apply(Object t) { 
     return func.apply(t); 
    } 
} 
+1

足够接近 - 我会把它作为一个胜利!没有太多的锅炉板,因为至少它不重复样板。如果有很多例子,简洁会受到欢迎。 – Bohemian 2014-10-31 00:33:06

+2

请注意,此模式的某些方面已在[此问题](http://stackoverflow.com/q/23361418/2711488)中讨论过... – Holger 2014-10-31 09:14:01

相关问题