Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否有一种惯用的方法来断言流只有一个元素,同时生成该元素?_Java_Java Stream - Fatal编程技术网

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());
}