Comparator :: reverseOrder和Comparator.reverseOrder()在流的排序方法中使用时有什么区别

时间:2018-04-19 08:05:56

标签: java sorting java-8 java-stream comparator

在排序的流方法中使用Comparator::reverseOrderComparator.reverseOrder()之间有什么区别。

    Stream<String> streamText = Stream.of("over the river", "through the woods", "to grandmother's house we go");

这有效:

    streamText.filter(n -> n.startsWith("t"))
         .sorted(Comparator.reverseOrder())
         .findFirst().ifPresent(System.out::println);

但是这不能编译:

    streamText.filter(n -> n.startsWith("t"))
         .sorted(Comparator::reverseOrder)
         .findFirst().ifPresent(System.out::println);

1 个答案:

答案 0 :(得分:9)

好问题!

sorted需要Comparator<T>,对吗? Comparator<T>是一个功能界面。它表示一个函数,它接受2个参数并返回一个int,表示哪个参数更大或者它们是否相等。

对于Comparator.reverseOrder()reverseOrder是一种返回Comparator<T>的方法。在这种情况下,您调用该方法并返回Comparator,该sorted可用作Comparator::reverseOrder的参数。一切都很好。

如果是reverseOrder,则不会调用reverseOrder。相反,您将sorted作为函数传递给sorted。如上所述,int将接受一个带有2个参数并返回reverseOrder的函数,但是您给它Comparator<T>,它不带参数并返回Comparator<T>。看到这里的不匹配?

  

预期:一个函数,它接受2个参数并返回一个int OR Comparator<T>对象

     

你给它的东西:一个不带参数并返回 dur <- df %>% mutate(Date = as.numeric(as.POSIXct(Date))) %>% group_by(SessionId) %>% summarize(duration = max(Date)-min(Date))

的函数

这会导致编译器错误。