【问题标题】:Can an implementation of an enum that is a Function be expressed using a lambda?可以使用 lambda 表示作为函数的枚举的实现吗?
【发布时间】:2014-10-31 00:24:23
【问题描述】:

假设我想创建一组相关的函数并将它们分组到一个枚举中。

我可以编码,例如:

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 的语法?

【问题讨论】:

  • 我很好奇编译错误是什么。
  • 在枚举中声明一个Function&lt;Object, String&gt; 字段,将其传递给构造函数,然后像在第二个sn-p 中那样调用构造函数对你有用吗?还是样板太多了?
  • @yshavit 这就是我认为他在第二次 sn-p 中尝试做的事情。 (也许我的假设是错误的。)
  • 在 Java 8 中将Functions 包装在枚举中的point 没有那么多。该实现非常聪明,可以提取一个单例 lambda,而不是每个都重新生成它引用它的时间,因此您不妨将 lambdas 直接插入到您使用它们的地方。
  • @LouisWasserman 但我希望使用枚举向开发人员展示有意义的函数列表(即强类型一组受支持的功能)的好处,并且我也在迭代它们并在特定情况下应用所有功能。

标签: java enums lambda java-8


【解决方案1】:

不,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);
    }
}

【讨论】:

  • 足够接近 - 我会把它当作胜利!没有太多的样板,因为至少它不会重复样板。如果有很多情况,欢迎简洁。
  • 请注意,这种模式的某些方面已经在 this question... 中讨论过
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-09
相关资源
最近更新 更多