Java 方法签名:Stream vs. Collection vs. var-arg



对于Java 8 Lambda/Closure,是否有一种通用的最佳方法?

在将单个对象用作参数或对象集合的方法的情况下,我看到三个选项来实现这一点:

 private void optionOneVararg(String... params) { ... }
 private void optionTwoCollection(Collection<String> params) { ... }
 private void optionThreeStream(Stream<String> params) { ... }

显然,String 类被用作示例。

对此是否有普遍有效的"最佳实践"方法?vararg方法产生了直到Java 7的最流畅的代码。有了溪流,感觉很笨拙。

我希望能够在方法内部和我调用它的外部使用 lambda 的便利性。我也想继续包装/胶码(例如 Collections.singletonList(element)Arrays.asList(element))降至最低,并避免使用Collection myCollection = stream.collect(...)后跟myCollection.stream()

您仍然可以通过调用 Stream.of(String...) 在方法中使用 Stream API 和 lambda。在这种情况下,您可以使用 varargs 保留签名:

private void optionVarArgs(String... params) {
   Stream.of(params)...
   ...
}

感谢AR.3的回答,我意识到将Stream作为参数在性能和美学方面都更胜一筹:

private void callOptionThreeFromStream() {
    List<String> foo = Arrays.asList(new String[] { "a", "b", "c" });
    Stream<String> stream = foo.stream();
    // use stream here
    optionThreeStream(stream);
}
private void callOptionThreeFromObject() {
    String bar = "a";
    optionThreeStream(Stream.of(bar)); //very simple conversion
}
private void optionThreeStream(Stream<String> params) {
    // use the same stream (and possibly profit from optimization)
}

使用 vararg 参数会导致更多开销(至少在美学上):

private void callOptionOneFromStream() {
    List<String> foo = Arrays.asList(new String[] { "a", "b", "c" });
    Stream<String> stream = foo.stream();
    // use stream here
    optionOneVararg(stream.toArray(String[]::new)); //still clumsy
}
private void callOptionOneFromObject() {
    String bar = "a";
    optionOneVararg(bar); //but optimal here
}
private void optionOneVararg(String... params) {
    Stream<String> stream = Stream.of(params);
    // use the new stream on the newly created array
}

为了完整起见:

private void callOptionTwoFromStream() {
    List<String> foo = Arrays.asList(new String[] { "a", "b", "c" });
    Stream<String> stream = foo.stream();
    // use stream here
    optionTwoCollection(stream.collect(Collectors.toList())); //clumsy
}
private void callOptionTwoFromObject() {
    String bar = "a";
    optionTwoCollection(Collections.singletonList(bar)); //clumsy
}
private void optionTwoCollection(Collection<String> params) {
    Stream<String> stream = params.stream();
    // use the new stream on the newly created collection
}

我个人的结论是:将Stream用于私有方法。将 var-arg 或集合保留在公共 API 方法中可能更适合隐藏内部技术细节。

这是一个很好的细节,Stream.of使用 var-arg 参数一次覆盖数组和单个对象。

最新更新