三分钟直观理解入参为 Function<? super T, ? extends V> :从需求侧概念入手

开门见山

Function 这一函数接口,本身就表达了对传入函数的需求说明

一个最常见的用途,就是我们已经“准备”好了传入的参数,需要一个函数来处理。建议以下例子中,可以代入 Stream.map 方法来理解,这个方法的入参就是一个函数接口 Function。

对于这个函数,最需要表达的要求(之一),就是这个函数必须能够处理我准备好的参数类型,我们假设这个类型为 Bird 。那么,这个函数实际声明的参数类型,一定必须是 Bird 的父(超)类:否则,我这个 Bird 就传不进去了
我们来极端理解一下:如果传入的函数的入参,其类型为 Object,那显然可以处理 Bird,符合要求;反之,如果这个类型是 BirdWithManyFeature,那显然就没办法处理我的需求,不符合要求。

返回值的类型也可以这么理解。对于函数接口 Function,我需要对其返回对象进行的操作是明确的,这个对象必须具备 类型 V 的某些特质,但具体是哪个子类就无所谓了。


简而言之:

  • 声明一个函数(方法),就像是,我声明了以下这类代码可以处理某一类 (例如 InputClass)的对象,具体地,你给我 AnyClass extends InputClass 都是满足 InputClass 的要求;
  • 声明一个函数接口,就像是,我要处理某个对象 T,你给我的函数必须要能处理这个 T,因此你这个函数的入参比如是 T 的父(超)类,具体是 Object 还是别的什么,只要能处理 T 的都行,所以是 ? super T。

后记:
写此文的目的,是因为函数接口这一特性,看似与一些面向过程语言中的“函数引用”类似,但其实又根本不同。对于已经理解或熟练使用的人,恐怕不屑于多费唇舌,因此经常使用一些“严格”、“宽松”这样略显抽象的字眼,让像我这样的门外小白摸不着头脑。但如果将“接口”与“需求说明”这样的概念对比起来,再结合例如 Stream.map 这样常见的典型案例来理解,就很容易消化了。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`Function<? super T, ? extends Stream<? extends R>> mapper`是一个函数式接口`Function`的方法签名,其中: - `T`是函数的输类型 - `R`是函数的输出类型 这个函数式接口的作用是将一个类型为`T`的输对象映射为一个类型为`Stream<? extends R>`的输出流,因此它的方法签名为`apply(T t): Stream<? extends R>`。 具体来说,`? super T`表示`T`的父类型,其中`super`是Java中的通配符边界符。这意味着该函数可以接受`T`类型的对象或其某个父类类型的对象作为输。而`? extends Stream<? extends R>`表示一个`Stream`类型的子类型,它的元素类型是`R`或`R`的子类型。 这种方法签名通常在Java 8中的流式计算中使用,例如`flatMap()`方法,它可以将一个流中的每个元素映射为一个流,然后将这些流合并成一个流。在这种情况下,`mapper`数就是一个函数,它将流中的每个元素映射为一个流。例如: ```java List<List<Integer>> list = Arrays.asList( Arrays.asList(1, 2, 3), Arrays.asList(4, 5, 6), Arrays.asList(7, 8, 9) ); List<Integer> result = list.stream() .flatMap(line -> line.stream()) // 将每个列表转换为流 .collect(Collectors.toList()); System.out.println(result); // 输出 [1, 2, 3, 4, 5, 6, 7, 8, 9] ``` 在这个例子中,我们首先创建了一个包含三个包含整数的列表的列表`list`,然后使用`flatMap()`方法将每个内部列表转换为流。在这个方法中,`mapper`数是一个函数,它将每个内部列表映射为一个流。在这里,这个函数是`line -> line.stream()`,它将每个内部列表转换为一个流。最后,我们使用`collect()`方法将所有元素收集到一个列表中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值