Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.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,我使用非流方式从集合中获取单个元素 List<MyCustomClass> list = OtherObject.getMyList(); if (list.size() != 1) { throw new RuntimeException(); } MyCustomClass customClass = list.get(0); List List=OtherObject.getMyList(); 如果(list.size()!=1){ 抛出新的RuntimeExceptio

我使用非流方式从集合中获取单个元素

List<MyCustomClass> list = OtherObject.getMyList();

if (list.size() != 1) {
throw new RuntimeException();
}

MyCustomClass customClass = list.get(0);
List List=OtherObject.getMyList();
如果(list.size()!=1){
抛出新的RuntimeException();
}
MyCustomClass=list.get(0);

有没有办法通过streams来代替这种多线性方法?

您可以尝试从
findFirst()
findAny()
返回可选的

希望有帮助。

您可以使用并确保流只产生一个结果

MyCustomClass customClass = list.stream()
        .reduce((a,b) -> { throw new RuntimeException("Too many values present"); })
        .orElseThrow(() -> { throw new RuntimeException("No value present"); });

我一直在寻找一个只有一个collect语句的版本,尽管它没有安德烈亚斯的解决方案那么简洁和优雅。它使用一个
收集器
的实现,该收集器累加到一个元素列表中,而如果我们有多个元素,则合并器会引发一个异常;当列表为空时,finisher将引发异常

list.stream().collect(
    Collector.of( ArrayList::new, 
                  (a, t) -> { if (!a.isEmpty())
                                  throw new RuntimeException();
                              a.add(t); },
                  (a, b) -> { throw new RuntimeException(); },
                  a -> { if( a.isEmpty() )
                             throw new RuntimeException();
                         return a.get(0);} );

有一种方法可以获取第一个元素,但是没有内置的方法来断言流只有一个项目;这不是streams使用模式的一部分。@chrylis onstrike-也就是说。@Andreas这不是一种内置的方式,而且它在任何可以想象的方面都是可怕的。@Polygenme我从来没有说过它很漂亮,但它是一种通过使用streams来实现OP想要的方式。它是内置的,唯一的自定义代码是构造要抛出的异常。或者你会说排序不是内置的,因为它需要用户提供比较(自然或显式)?我不同意对“内置”的严格解释。@Andreas通过使用内置,您可以用java编写的所有东西都是“内置”的。需要有线电视新闻网吗?这里只是一些代码行,这些都是Java内置的。。。是的,不。编辑以删除此类声明。当列表包含多个元素时,此答案不适用。这是公平的。从最初的问题来看,似乎只检查一个元素只是为了确保有一些元素可以抓取。这就是使用
findAny
findFirst
会很方便的地方。但是在这个问题中,要检查的条件是
list.size()1
而不是
list.isEmpty()
。这不是内置的,它远不如OP的原始代码清晰,效率也低得多。@chrylis onstrike-
reduce()
orelsetrow()
都是内置的。OP并没有要求更干净/更简单的代码,只要求流解决方案在单个语句(“一行程序”)中执行相同的操作。
MyCustomClass customClass = list.stream()
        .reduce((a,b) -> { throw new RuntimeException("Too many values present"); })
        .orElseThrow(() -> { throw new RuntimeException("No value present"); });
list.stream().collect(
    Collector.of( ArrayList::new, 
                  (a, t) -> { if (!a.isEmpty())
                                  throw new RuntimeException();
                              a.add(t); },
                  (a, b) -> { throw new RuntimeException(); },
                  a -> { if( a.isEmpty() )
                             throw new RuntimeException();
                         return a.get(0);} );