一、Function.identity()简单介绍

当我们使用Stream时,要将它转换成其他容器或Map。这时候,就会使用到Function.identity()

Stream<String> stream = Stream.of("This", "is", "a", "test");
Map<String, Integer> map = stream.collect(Collectors.toMap(Function.identity(), String::length));

Function是一个接口,那么Function.identity()是什么意思呢?解释如下:

Java 8允许在接口中加入具体方法。接口中的具体方法有两种,default方法static方法identity()就是Function接口的一个静态方法。
Function.identity()返回一个输出跟输入一样的Lambda表达式对象,等价于形如t -> t形式的Lambda表达式。

identity()方法JDK源码如下:

static  Function identity() {return t -> t;
}

二、Function.identity()的应用

下面的代码中,Task::getTitle需要一个task并产生一个仅有一个标题的key。task -> task是一个用来返回自己的lambda表达式,根据上例,可以得知会返回一个task。

private static Map<String, Task> taskMap(List<Task> tasks) {return tasks.stream().collect(toMap(Task::getTitle, task -> task));
}

可以使用Function接口中的默认方法identity来让上面的代码代码变得更简洁明了、传递开发者意图时更加直接,下面是采用identity函数的代码。

import static java.util.function.Function.identity;private static Map<String, Task> taskMap(List<Task> tasks) {return tasks.stream().collect(toMap(Task::getTitle, identity()));
}

三、Function.identity() 和 t->t的选择

Arrays.asList("a", "b", "c").stream().map(Function.identity()) // <- This,.map(str -> str)          // <- is the same as this..collect(Collectors.toMap(Function.identity(), // <-- And this,str -> str));        // <-- is the same as this.

上面的代码中,为什么要使用Function.identity()代替str->str呢?它们有什么区别呢?

在上面的代码中str -> strFunction.identity()是没什么区别的因为它们都是t->t。但是我们有时候不能使用Function.identity,看下面的例子:

List list = new ArrayList<>();
list.add(1);
list.add(2);

下面这段代码可以运行成功:

int[] arrayOK = list.stream().mapToInt(i -> i).toArray();

但是如果你像下面这样写:

int[] arrayProblem = list.stream().mapToInt(Function.identity()).toArray();

运行的时候就会错误,因为mapToInt要求的参数是ToIntFunction类型,但是ToIntFunction类型和Function没有关系。

Function.identity()的使用详解相关推荐

  1. 关于numpy中eye和identity的区别详解

    https://www.jb51.net/article/175386.htm np.identity(n, dtype=None) np.eye(N, M=None, k=0, dtype=< ...

  2. Jquery中$(document).ready(function(){ })函数的使用详解

    Jquery是优秀的Javascrīpt框架,$是jquery库的申明,它很不稳定(我就常遇上),换一种稳定的写法jQuery.noConflict(); jQuery(document).ready ...

  3. 【c++】24.std::function和std::bind详解

    1. 可调用对象 查看全文 http://www.taodudu.cc/news/show-494578.html 相关文章: [c++]26.浅谈"事件驱动".select.po ...

  4. 2021-09-25 在uniapp中 打包成app调用地图 提示 uni.authorize is not a function 怎么办 (图文详解)

    很简单的解决方法,因为 如果你是小程序的话 调用地图是需要授权的,所以你就用到了uni.authorize 这个方法,但是这个方法只是支持小程序调用,H5和APP是无法调用的,所以这个时候你只需要加一 ...

  5. Java8 Function.identity() 的使用

    一.简单介绍 话不多说,直接上JDK源码: static Function identity() {return t -> t; } 我们可以看到,Function.identity() 的作用 ...

  6. python 正则表达式 断言 不定长表达式_【教程】详解Python正则表达式之: (?!…) negative lookahead assertion 前向否定匹配 /前向否定断言...

    Python 2.7的官网文档中的解释是:(?!...)Matches if ... doesn't match next. This is a negative lookahead assertio ...

  7. EXT核心API详解(二)-Array/Date/Function/Number/String

    EXT核心API详解(二)-Array/Date/Function/Number/String Array类 indexOf( Object o )  Number object是否在数组中,找不到返 ...

  8. 机器学习(十九)——PageRank算法, KNN, loss function详解

    http://antkillerfarm.github.io/ PageRank算法 概述 在PageRank提出之前,已经有研究者提出利用网页的入链数量来进行链接分析计算,这种入链方法假设一个网页的 ...

  9. JavaScript Function.arguments 属性详解

    转载自   JavaScript Function.arguments 属性详解 arguments属性是正在执行的函数的内置属性,返回该函数的arguments对象.arguments对象包含了调用 ...

最新文章

  1. http反向代理调度算法追朔
  2. jupyter notebook中执行命令报错No module named ‘wordcloud‘
  3. 通俗易懂!《图机器学习导论》(附链接)
  4. swift混编oc碰到的问题
  5. 【图像超分辨率】End-to-End Super-Resolution for Remote-Sensing Images Using an Improved Multi-Scale Residual
  6. SQL SERVER 2016研究三
  7. 任务调度及远端管理(基于Quartz.net)
  8. epoll哪些触发模式_epoll的内部实现 百万级别句柄监听 lt和et模式非常好的解释...
  9. Silverlight、XAML实现滚动文字
  10. Express初级学习
  11. Base64加密处理
  12. Java从零开始学十五(继承)
  13. Ipad mini2、苹果5s降级10.3.3教程
  14. Abaqus动力学分析基础
  15. 联合查询(union)——MySQL
  16. 软件测试-搭建测试环境
  17. 计算机可移动磁盘无法显示图片,电脑不显示移动硬盘图标?两种解决办法
  18. 又一款数据分析神器:Polars 真的很强大
  19. 浅谈Camera subsytem
  20. 北风:在给我一面国旗换头像中,有人通过这个来获利吗?(亲身经历)

热门文章

  1. 嵌入式低功耗 Wi-Fi 物联网报警系统——基于 TI 的 CC3200
  2. VS code win10 环境,下载安装调试
  3. 求概率密度函数方法之单调性定理
  4. Зима !!! (冬天)——本文配俄罗斯经典歌曲《分别》,请进入文章正页点击欣赏)
  5. 段错误:SIGSEGV
  6. JZVideo--全屏切小屏报错没有获得的窗口错误
  7. 易中天品汉代风云人物01: 冤死的晁错(上)
  8. Canvas加动画,实现火柴人跳绳效果,Android经典入门教程
  9. CSDN新手积分获取办法
  10. MDK5/KeiluVsion5安装报错“Download of PDSC index file failed”