繁体   English   中英

Java 8流和varargs

[英]Java 8 streams and varargs

根据Effective Java 2nd Ed ,当你想编写一个允许varargs的方法签名但仍然强制你在编译时只有一个元素时,你应该这样编写方法签名:

public void something(String required, String ... additional) {
    //... do what you want to do
}

如果我想要传输所有这些元素,我一直在做这样的事情:

public void something(String required, String ... additional) {
    Stream<String> allParams =
        Stream.concat(Stream.of(required), Stream.of(additional));
    //... do what you want to do
}

这感觉非常不优雅和浪费,特别是因为我正在创建一个1流并将其与另一个连接。 有更清洁的方法吗?

这是一种在不创建两个Streams情况下执行此操作的方法,尽管您可能不喜欢它。

Stream.Builder<String> builder = Stream.<String>builder().add(required);
for (String s : additional) {
  builder.add(s);
}

Stream<String> allParams = builder.build();

不幸的是,Java可能非常冗长。 但缓解这种情况的另一个选择是简单地使用静态导入。 在我看来,它不会使您的代码不那么清晰,因为每个方法都与流相关。

Stream<String> allParams =
    concat(of(required), of(additional));

组合流没有任何问题。 这些对象是轻量级的,因为它们只引用源数据,但不复制数组内容等数据。 如果实际有效载荷也非常小,那么这种轻量级对象的成本可能才有意义。 可以使用专门的,语义上等效的重载来处理这样的场景:

public void something(String required, String ... additional) {
    somethingImpl(Stream.concat(Stream.of(required), Stream.of(additional)));
}
public void something(String required) {
    somethingImpl(Stream.of(required));
}
public void something(String required, String second) {
    somethingImpl(Stream.of(required, second));
}
private void somethingImpl(Stream<String> allParams) {
    //... do what you want to do
}

因此,在只有一个参数的情况下,您不仅要保存Stream实例,还要保存varargs数组(类似于Stream.of的重载)。 这是一种常见模式,例如参见EnumSet.of重载。

但是,在很多情况下,即使这些简单的重载也不是必需的,并且可能被认为是过早的优化(像JRE这样的库提供它们,因为如果需要,应用程序开发人员不可能添加它们)。 如果something是应用程序而不是库的一部分,则除非分析器告诉您该参数处理导致瓶颈,否则不应添加它们。

如果您愿意使用Guava,可以使用Lists.asList(required, additional).stream() 创建该方法是为了简化具有最低要求惯用语的varargs。

旁注,我认为图书馆真的很有用,但当然因为这个而添加它并不是一个好主意。 检查文档 ,看看它是否对您有用。

像我的StreamExjOOλ这样的Stream API的第三方扩展提供了appendprepend等方法,允许您以更干净的方式执行此操作:

// Using StreamEx
Stream<String> allParams = StreamEx.of(required).append(additional);
// Using jOOL
Stream<String> allParams = Seq.of(required).append(additional);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM