Java 是否有一种惯用的方法来断言流只有一个元素,同时生成该元素?
从以下代码开始:Java 是否有一种惯用的方法来断言流只有一个元素,同时生成该元素?,java,java-stream,Java,Java Stream,从以下代码开始: public Thing thereCanBeOnlyOne(Stream<Thing> stream) { List<Thing> things = stream.collect(Collectors.toList()); if(things.size() != 1) { throw new IllegalArgumentException(); } return things.get(0); } 公共事物只有一个(流){
public Thing thereCanBeOnlyOne(Stream<Thing> stream) {
List<Thing> things = stream.collect(Collectors.toList());
if(things.size() != 1) {
throw new IllegalArgumentException();
}
return things.get(0);
}
公共事物只有一个(流){
List things=stream.collect(Collectors.toList());
如果(things.size()!=1){
抛出新的IllegalArgumentException();
}
返回物品。获取(0);
}
有没有更简洁的方式来表达方法体
到目前为止,我尝试的是:
我阅读了Collector
和reduce
的文档,但没有找到任何内容。如何
public static Thing thereCanBeOnlyOne(Stream<Thing> stream) {
Object[] array = null;
if((array = stream.limit(2).toArray()).length != 1) {
throw new IllegalArgumentException();
}
return (Thing)array[0];
}
publicstaticthingthereecanbeonlyone(流){
Object[]数组=null;
if((数组=stream.limit(2.toArray()).length!=1){
抛出新的IllegalArgumentException();
}
返回(物)数组[0];
}
在我看来,这似乎减少了开销。如果您喜欢使用番石榴,请使用:
公共事物只有一个(流){
return stream.collect(MoreCollectors.onlyElement());
}
等价物可能存在于其他公共库中;我只是对番石榴很熟悉。
.reduce(IDENTITY,(a,b)->{if(a.equals(IDENTITY))返回b;抛出新的IllegalArgumentException();})代码>但这取决于你的品味。取决于你对“惯用”的要求:番石榴是我的首选。哦,番石榴也有收藏家。@AndyTurner当然有一个用于此目的的外部图书馆是过分的?@OleV.V。这不完全是一个正在工作的外部库;)当然,如果这就是你所需要的,那就太过分了。但是如果你已经在使用它的话,它是很好和容易的。其他库也存在,ofc,因此您可以在您已经使用的库中找到一个等效库。stream.limit(2)。toArray()对于流中的“lots”更好。此外,空赋值是多余的,只需在声明时从流中分配数组即可。不确定此处提到的开销是什么,但stream.limit(2).toArray(Thing[]::new)
可能为您提供准确的类型我计算了调用收集器和创建列表的开销。如果我不首先声明数组,由于作用域问题,将找不到它返回第一个元素。是的,我本可以处理流,然后检查长度,但我没有。我喜欢限制的想法希望我能想到它:)人们也可以使用公共静态T-There-CanbeOnlyone(Stream-Stream)
以及@SuppressedWarnings(“unchecked”)
使它更通用。在这种情况下,将对象强制转换到T
不会引起问题。这一点不再简洁或清晰。问题并不是关于开销,但既然您提到了它,当流在运行时只包含1个元素时,开销是相同的。这很好。我还发现.collect(collector.reduced((a,b)->null))
作为一个有趣的替代方法(返回null而不是引发异常)。
public Thing thereCanBeOnlyOne(Stream<Thing> stream) {
return stream.collect(MoreCollectors.onlyElement());
}