对于Java 8 Lambda / Closure, var-arg 方法签名是否有一般的最佳方法?
在使用单个对象作为参数或对象集合的方法的情况下,我看到三个选项来实现这一点:
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()
。
答案 0 :(得分:2)
您仍然可以通过调用Stream.of(String...)
在方法中使用Stream
API和lambdas。在这种情况下,您可以使用varargs保留签名:
private void optionVarArgs(String... params) {
Stream.of(params)...
...
}
答案 1 :(得分:0)
感谢AR.3s的回答,我意识到保持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
作为私人方法。在公共API方法中保留var-arg或Collections可能更适合隐藏内部技术细节。
这是一个很好的细节, Stream.of
使用var-arg参数一次覆盖数组和单个对象。