Java JDK库是否提供lambda';调用程序';实用类?

Java JDK库是否提供lambda';调用程序';实用类?,java,lambda,java-8,static-initializer,Java,Lambda,Java 8,Static Initializer,我希望用lambdas替代单独的静态初始化器函数。e、 我想换个这样的东西 class Foo { private static final Set<String> keywords = keywords(); private static Set<String> keywords() { HashSet<String> s = new HashSet<>(); s.add("AND");

我希望用lambdas替代单独的静态初始化器函数。e、 我想换个这样的东西

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);
    }
}
然后在另一节课上:

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);
    });
}
import static com.whatever.Initializer.init;
福班{
私有静态最终集关键字=init(()->{
HashSet s=新的HashSet();
s、 添加(“和”);
s、 添加(“非”);
s、 添加(“或”);
返回集合。不可修改集合;
});
}

标准Java库中是否已经存在一些东西,因此我不需要提供自己的
初始值设定项
类,或者是否有某种方法可以简单地定义并执行lambda

您只需铸造lambda并将其命名为:

private static final Set<String> KEYWORDS = ((Supplier<Set<String>>) () -> {
    Set<String> result = new HashSet<>();
    ...
    return Collections.unmodifiableSet(result);
}).get();
私有静态最终设置关键字=((供应商)(->{
Set result=new HashSet();
...
返回集合。不可修改集合(结果);
}).get();
或者您可以使用现有的快捷方式:

private static final Set<String> KEYWORDS = 
    Collections.unmodifiableSet(new HashSet<>(Arrays.asList("AND", "NOT", "OR")));
私有静态最终设置关键字=
Collections.unmodifiableSet(新的HashSet(Arrays.asList(“AND”、“NOT”、“OR”));

但是,调用方法的原始代码非常可读。我不会更改它。

正如@zeroplagl所提到的,在这里您不需要使用lambdas。您可以使用以下命令在一行中初始化
关键字

Collections.unmodifiableSet(new HashSet<String>(Arrays.asList("AND", "NOT", "OR")));
Collections.unmodifiableSet(新的HashSet(Arrays.asList(“AND”、“NOT”、“OR”));
但这并不漂亮。否则,使用
静态
块会有什么问题?它是为这样的事情而创造的


但是如果你不想使用它,我认为没有标准的方法。您必须使用初始值设定项。

我只写一个特殊的实用程序方法,它完成整个链:

public class Sets {
    public static <T> Set<T> of(T... elements) {
        return Collections.unmodifiableSet(new HashSet<>(Arrays.asList(elements)));
    }
}
公共类集合{
公共静态集合(T…元素){
返回集合.unmodifiableSet(新的HashSet(Arrays.asList(elements));
}
}
并在必要时使用:

private static final Set<String> KEYWORDS = Sets.of("AND", "NOT", "OR");
private static final Set KEYWORDS=Set.of(“AND”、“NOT”、“OR”);

如果你碰巧用番石榴,已经有一种。希望这样的特性会出现在Java-9中。有一种方法可以写入
Set.of(“AND”,“NOT”,“OR”)

你不需要一种方法来初始化
关键字。你的lambda版本到底有什么意义?为什么你在这里需要lambda?似乎您只需要一个静态初始值设定项块(
static{}
)并在那里调用init?相关:对于这个特殊情况,我喜欢Guava集合:
KEYWORDS=ImmutableSet.of(“and”、“NOT”、“OR”)
与普通静态初始值设定项相比,我仍然没有得到使用lambda的好处。事实上,它甚至与问题的原始方法没有什么不同,因为代码仍然在一个静态方法中,现在是一个合成方法。只有它被调用的方式才有更多的开销。@Holger我100%同意。我只是想证明这是可能的。但正如我的回答所说,我发现原来的代码更具可读性,并且不会改变它。对,我理解这一点,并且一开始并没有对您进行说明。我把评论放在你的答案下而不是问题下,因为你的答案已经被接受了,所以OP说它解决了他的实际问题,但仍然不清楚以哪种方式(或实际问题是什么)…@JBNizet你可能对Java 9感兴趣!虽然这对集合很有用,但对其他类型的初始化却没有用处。@Bill,如果“其他类型的初始化”(不管是什么)不能在单个表达式中执行,可能应该对其进行重构。考虑创建新的构造函数、工厂方法或实现生成器模式。我相信解决每种情况下的这个问题要比创造一个广义的解决方案好得多,而广义的解决方案无论如何都是丑陋的。
private static final Set<String> KEYWORDS = Sets.of("AND", "NOT", "OR");