我希望用 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/