我有一个,List
并希望按字母顺序获取该列表的第一个和最后一个字符串.我想使用Java 8和Streams与收集器的强大功能来解决这个问题.
这不起作用:
String first = list.stream().collect(Collectors.minBy(String.CASE_INSENSITIVE_ORDER));
它给了我一个编译器错误:
类型不匹配:无法从Optional转换为String
你能解释一下为什么并告诉我做我想做的最好的方法吗?
Collectors.minBy
并Collectors.maxBy
返回Optional
:如果Stream为空,Optional
则返回空; 否则,Optional
返回包含结果的内容.
如果您希望null
在Stream为空时拥有默认值(或只是),则可以调用orElse
.
String first = list.stream().collect(minBy(String.CASE_INSENSITIVE_ORDER)).orElse(null);
此外,如果您确定Stream不为空,则可以直接调用get()
并检索该值.
作为旁注,您还可以通过调用Collections.min
(resp.Collections.max
)返回最小值:
String first = Collections.min(list, String.CASE_INSENSITIVE_ORDER);
无需创建Stream管道.请注意,如果列表为空,这将引发异常.
错误信息非常清楚.所以是javadoc:Collector.minBy()
产生类型的结果Optional
,即Optional
在你的情况下.
为什么?因为如果流恰好是空的,它不能返回任何字符串.所以你需要从返回的Optional中获取 String值.collect()
请注意,get()将抛出一个异常,因为流是空的,因此找不到最小值coult.如果这是你想要的,因为永远不应该发生空列表,那很好.否则,您应该使用orElse()或orElseThrow()来返回备用默认值,或者抛出另一个异常.