JDK 库是否提供 lambda 'invoker' 实用程序 class?
Do the JDK libraries provide a lambda 'invoker' utility class?
我正在寻找用 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);
}
}
使用调用在 class 加载时就地定义的 lambda 的东西。请注意,懒惰地调用它不是我的目标。
目前,我创建了一个简单的 Initializer
class,它带有一个接受 Supplier
的静态方法,调用它并 returns 值。
Initializer
class
public class Initializer {
public static <T> T init(Supplier<T> initializer) {
return initializer.get();
}
}
然后在另一个class:
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
class,或者是否有一些方法可以简单地定义然后就地执行 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")));
但是你的原始代码,调用一个方法,可读性很强。我不会改变它。
如@zeroflagL 所述,您不需要在此处使用 lambda。您可以使用以下代码在一行中初始化 keywords
:
Collections.unmodifiableSet(new HashSet<String>(Arrays.asList("AND", "NOT", "OR")));
但这不是那么漂亮。否则,使用 static
块有什么问题?它就是为这样的事情而创建的。
但是如果不想用,我觉得没有标准的方法。你必须使用你的初始化器。
我会写一个特殊的实用方法来完成整个链:
public class Sets {
public static <T> Set<T> of(T... elements) {
return Collections.unmodifiableSet(new HashSet<>(Arrays.asList(elements)));
}
}
并在必要时使用它:
private static final Set<String> KEYWORDS = Sets.of("AND", "NOT", "OR");
如果你碰巧使用 Guava,已经有一个 bunch of such methods. Hopefully such feature will appear in Java-9. There's JEP 269 可以写 Set.of("AND", "NOT", "OR")
.
我正在寻找用 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);
}
}
使用调用在 class 加载时就地定义的 lambda 的东西。请注意,懒惰地调用它不是我的目标。
目前,我创建了一个简单的 Initializer
class,它带有一个接受 Supplier
的静态方法,调用它并 returns 值。
Initializer
class
public class Initializer {
public static <T> T init(Supplier<T> initializer) {
return initializer.get();
}
}
然后在另一个class:
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
class,或者是否有一些方法可以简单地定义然后就地执行 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")));
但是你的原始代码,调用一个方法,可读性很强。我不会改变它。
如@zeroflagL 所述,您不需要在此处使用 lambda。您可以使用以下代码在一行中初始化 keywords
:
Collections.unmodifiableSet(new HashSet<String>(Arrays.asList("AND", "NOT", "OR")));
但这不是那么漂亮。否则,使用 static
块有什么问题?它就是为这样的事情而创建的。
但是如果不想用,我觉得没有标准的方法。你必须使用你的初始化器。
我会写一个特殊的实用方法来完成整个链:
public class Sets {
public static <T> Set<T> of(T... elements) {
return Collections.unmodifiableSet(new HashSet<>(Arrays.asList(elements)));
}
}
并在必要时使用它:
private static final Set<String> KEYWORDS = Sets.of("AND", "NOT", "OR");
如果你碰巧使用 Guava,已经有一个 bunch of such methods. Hopefully such feature will appear in Java-9. There's JEP 269 可以写 Set.of("AND", "NOT", "OR")
.