java - JDK 库是否提供 lambda 'invoker' 实用程序类?

标签 java lambda java-8 static-initializer

我希望用 lambda 代替对单独的静态初始值设定项函数的需求。例如我想更换这样的东西......

class Foo {
    private static final Set<String> keywords = keywords();

    private static Set<String> keywords() {
        HashSet<String> s = new HashSet<>();
        s.add("AND");
        s.add("NOT");
        s.add("OR");
        return Collections.unmodifiableSet(s);
    }
}

使用调用在类加载时定义的 lambda 的东西。请注意,我的目标不是延迟调用它。

目前,我创建了一个简单的 Initializer 类,其中包含一个静态方法,该方法接受 Supplier、调用它并返回值。

初始化器

public class Initializer {
    public static <T> T init(Supplier<T> initializer) {
        return initializer.get();
    }    
}

然后在另一个类中:

import static com.whatever.Initializer.init;

class Foo {
    private static final Set<String> keywords = init(() -> {
        HashSet<String> s = new HashSet<>();
        s.add("AND");
        s.add("NOT");
        s.add("OR");
        return Collections.unmodifiableSet(s);
    });
}

标准Java库中是否已经存在一些东西,这样我就不需要提供自己的Initializer类,或者是否有某种方法可以简单地定义然后执行lambda -地方?

最佳答案

您可以直接转换 lambda 并调用它:

private static final Set<String> KEYWORDS = ((Supplier<Set<String>>) () -> {
    Set<String> result = new HashSet<>();
    ...
    return Collections.unmodifiableSet(result);
}).get();

或者您可以使用现有的快捷方式:

private static final Set<String> KEYWORDS = 
    Collections.unmodifiableSet(new HashSet<>(Arrays.asList("AND", "NOT", "OR")));

但是您调用方法的原始代码非常具有可读性。我不会改变它。

关于java - JDK 库是否提供 lambda 'invoker' 实用程序类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33452756/

相关文章:

java - Android TicTacToe - 随机游戏结局

java - 为什么 java.util.Collection 不实现新的 Stream 接口(interface)?

c# - Lambda 参数不在范围内——在构建二进制 lambda 表达式时

java - 如何对对象集合进行排序

java - 流内部如何处理数据?

java - 使用 Java 泛型的多个绑定(bind)类型定义接口(interface)

java - 上传后如何以缩略图格式存储jpeg、gif、图像

java - 尝试在子类中调用父类(super class)方法

c# - 捕获变量实例化问题

Java Stream - 如果使用流匹配则替换字符串?