获取列表的最小和最大字符串

pri*_*ain 3 java string java-8 java-stream

我有一个,List<String> list并希望按字母顺序获取该列表的第一个和最后一个字符串.我想使用Java 8和Streams与收集器的强大功能来解决这个问题.

这不起作用:

String first = list.stream().collect(Collectors.minBy(String.CASE_INSENSITIVE_ORDER));
Run Code Online (Sandbox Code Playgroud)

它给了我一个编译器错误:

类型不匹配:无法从Optional转换为String

你能解释一下为什么并告诉我做我想做的最好的方法吗?

Tun*_*aki 7

Collectors.minByCollectors.maxBy返回Optional:如果Stream为空,Optional则返回空; 否则,Optional返回包含结果的内容.

如果您希望null在Stream为空时拥有默认值(或只是),则可以调用orElse.

String first = list.stream().collect(minBy(String.CASE_INSENSITIVE_ORDER)).orElse(null);
Run Code Online (Sandbox Code Playgroud)

此外,如果您确定Stream不为空,则可以直接调用get()并检索该值.


作为旁注,您还可以通过调用Collections.min(resp.Collections.max)返回最小值:

String first = Collections.min(list, String.CASE_INSENSITIVE_ORDER);
Run Code Online (Sandbox Code Playgroud)

无需创建Stream管道.请注意,如果列表为空,这将引发异常.


JB *_*zet 5

错误信息非常清楚.所以是javadoc:Collector.minBy()产生类型的结果Optional<T>,即Optional<String>在你的情况下.

为什么?因为如果流恰好是空的,它不能返回任何字符串.所以你需要从返回的Optional中获取 String值.collect()

请注意,get()将抛出一个异常,因为流是空的,因此找不到最小值coult.如果这是你想要的,因为永远不应该发生空列表,那很好.否则,您应该使用orElse()或orElseThrow()来返回备用默认值,或者抛出另一个异常.

  • @BrianGoetz 除非您*希望*它在空列表中失败。 (2认同)
  • 当然,我大体上同意。但是如果目标是抛出,因为不应该发生空列表,那么 get() 已经做了正确的事情。这里似乎就是这种情况。 (2认同)