【问题标题】:Java 8: Comparator returns stream of Object instead of specific typeJava 8:比较器返回对象流而不是特定类型
【发布时间】:2015-08-07 20:40:32
【问题描述】:

我的问题是关于新的 java 8 集合流的可能性。我确实有一个以 Date 对象为键的排序映射。现在我已经编写了下面的方法,它必须在给定日期的键集中找到上一个键。因此,以相反的顺序迭代密钥集,它将是给定搜索日期之前的第一个日期。这是我的实现:

private Date getPreviousKey(Date searchKey, Map<Date, SchluesselSum> timesAndSums) {
return timesAndSums.keySet().stream()
    .sorted(Comparator.<Date>reverseOrder())
    .filter(date -> date.before(searchKey))
    .findFirst()
    .orElse(null);
}

现在的问题是,对 .sorted(Comparator.reverserOrder()) 的调用返回 java.lang.Object 流而不是 Date 并且我的编译器在 .isLessOrEqual(...) 中找不到。在 Object 类中调用 filter(...)。

我如何告诉 .sorted 方法,或者更准确地说,比较器返回 Date 而不是 Object?

提前感谢您的帮助!

【问题讨论】:

  • 您在使用 Eclipse 吗?它用 javac 编译得很好(你甚至可以省略显式类型参数)。
  • 我正在使用 Intellij IDEA 14.1 和 Java 1.8.0_45
  • Weird.. 我也在使用 IntelliJ(它在幕后使用 javac),我没有这个问题。问题绝对不在于这段代码。
  • 在 Eclipse 中也能正常编译(即使没有显式类型参数)。
  • 好吧,首先不要用java.util.Date 扩展名为Date 的类,以避免命名混淆。您也可以考虑使用新的 Java Time API。

标签: sorting collections java-8 java-stream


【解决方案1】:

问题似乎是由于您的自定义 Date 类。

但是请注意,如果您的地图也恰好是 NavigableMap(JDK 中的所有 SortedMap 都是可导航的),您可以调用 NavigableMap#lowerKey:

private Date getPreviousKey(Date searchKey, NavigableMap<Date, SchluesselSum> timesAndSums) {
  return timesAndSums.lowerKey(searchKey);
}

这将比您当前的方法更有效(就代码行数、可读性和性能而言)。

【讨论】:

  • 您,先生,拯救了我的一天!非常感谢。你是对的,它更具可读性。
  • ...如果地图在操作之前没有排序,使用.filter(date -&gt; date.before(searchKey)).max(naturalOrder())的简单线性搜索将比使用sorted更有效。乍一看,使用预排序的顺序可能看起来很聪明,但它忽略了排序本身的成本至少与线性搜索一样高。要么地图已经排序,然后lowerKey 是要走的路,要么线性搜索是不可避免的。仅当您打算为多个操作保留已排序的数据时,显式排序才有用。
猜你喜欢
  • 2015-10-11
  • 1970-01-01
  • 2017-10-06
  • 2013-06-04
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多