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