Comparator.comparing()的参数问题

caiyuen 2019-08-14 04:20:42

源码中 Comparator.comparing()需要接收一个Function类型的参数:

public static <T, U extends Comparable<? super U>> Comparator<T> comparing(
Function<? super T, ? extends U> keyExtractor)
{
Objects.requireNonNull(keyExtractor);
return (Comparator<T> & Serializable)
(c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
}

为何在时间使用时,可以传入Supplier类型的参数呢,如下

Supplier<String> colorStr = apple::getColor;
apples.sort(Comparator.comparing(Apple::getColor));


apple::getColor的返回值类型明明是Supplier类型的,居然可以出传入comparing方法中,而 Function和 Supplier 在源码中没有实现和继承等关系
...全文
4197 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
sotondolphin 2020-03-27
  • 打赏
  • 举报
回复 1
Supplier<String> colorStr = apple::getColor; apples.sort(Comparator.comparing(Apple::getColor)); 很明显传进去的不是 colorStr Supplier 类型啊
object adapter 2020-03-27
  • 打赏
  • 举报
回复
我也没搞懂为什么。在mybatisplus的LambdaQueryWrapper也是这样。自己试了试就不得行
caiyuen 2019-08-15
  • 打赏
  • 举报
回复 1
还有一个 问题 Collectors.toList()方法的源码: public static <T> Collector<T, ?, List<T>> toList() { return new CollectorImpl<>((Supplier<List<T>>) ArrayList::new, List::add, (left, right) -> { left.addAll(right); return left; }, CH_ID); } new CollectorImpl第二个参数传入的是 List::add 然而函数定义却是这样子的: CollectorImpl(Supplier<A> supplier, BiConsumer<A, T> accumulator, BinaryOperator<A> combiner, Set<Characteristics> characteristics) { this(supplier, accumulator, combiner, castingIdentity(), characteristics); } BiConsumer<A, T> accumulator,是怎么接收List::add 的呢 ,按理讲 List::add是典型的BiPredicate类型啊

51,395

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧