Function.identity()

Function.identity()是什么?

// 将Stream转换成容器或Map
Stream<String> stream = Stream.of("I", "love", "you", "too");
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() or 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没有关系

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/554810.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 异常——Exception详解

异常的介绍 异常的概念 异常 &#xff1a;指的是程序在执行过程中&#xff0c;出现的非正常的情况&#xff0c;最终会导致JVM的非正常停止。 在Java等面向对象的编程语言中&#xff0c;异常本身是一个类&#xff0c;产生异常就是创建异常对象并抛出了一个异常对象。Java处理…

时间复杂度和空间复杂度的计算方法

什么是算法 算法的定义是这样的&#xff1a;解题方案的准确而完善的描述&#xff0c;是一系列解决问题的清晰指令。巴拉巴拉的&#xff0c;虽然是一小句但还是不想看&#xff08;题外话&#xff1a;有时候吧专业名词记下来面试的时候还是挺有用的&#xff09;&#xff0c;其实…

Vue中嵌入html页面并相互通信

Vue中嵌入html页面并相互通信 引言&#xff1a;由于最近工作中用到了大量的Iframe去集成一些只能通过原生html、css、js开发的功能接口&#xff0c;因此特意做一下过程记录的笔记。方便交流学习使用。 1. Vue中嵌入Html的方式 1.1 html的页面是单独的一个服务&#xff0c;有…

Java中的URL类根据url获取网络文件快速入门Java中的URL(网络编程)

Java中的URL类 远程连接来实现应用。而且&#xff0c;这个平台现在已经可 以对国际互联网以及URL资源进行访问了。Java的URL类可以让访问网络资源就像是访问你本地的文件夹一样方便快捷。我们通过使用Java的URL类 就可以经由URL完成读取和修改数据的操作。 通过一个URL连接&a…

ByteArrayOutputStream详解

介绍&#xff1a; ByteArrayOutputStream 对byte类型数据进行写入的类 相当于一个中间缓冲层&#xff0c;将类写入到文件等其他outputStream。它是对字节进行操作&#xff0c;属于内存操作流 源码解析&#xff1a; public class ByteArrayOutputStream extends OutputStream…

MySQL如何查询表中重复的数据

一、查询重复记录 例&#xff1a;查询员工表里出现重复姓名的记录 思路&#xff1a; 1、查看重复记录&#xff0c;首先要使用分组函数&#xff08;group by&#xff09;&#xff0c;再用聚合函数中的计数函数count(name)给姓名列计数&#xff0c;且使用group by 后不可使用* …

Java中的Socket的用法——Socket、NioSocket

一、Java Socket的分类 Java中的Socket分为普通的Socket和NioSocket。 二、普通Socket Java中的网络通信时通过Socket实现的&#xff0c;Socket分为ServerSocket和Socket两大类&#xff0c;ServerSocket用于服务器端&#xff0c;可以通过accept方法监听请求&#xff0c;监听…

SpringMVC中Controller为什么能够处理并发访问?Springboot中的定时任务是否会发生阻塞?

文章目录SpringMVC中Controller为什么能够处理并发访问&#xff1f;当多个请求同时访问服务器的时候Controller、Service、DAO是线程安全的吗&#xff1f;关于类中的变量Controller、Service、DAO等类都默认为单例模式Controller、Service、DAO等类中的方法当中的并发问题关于D…

Java进阶 - 易错知识点整理

转载&#xff1a;https://blog.csdn.net/qq_33934427/article/details/125903960 文章目录1、JavaEE2、网络基础3、Mysql4、Spring/SpringMVC&#xff08;IOC装配、AOP增强、常用注解&#xff09;5、Spring Boot/Spring Cloud1&#xff09;SpringBoot部分2&#xff09;SpringCl…

如何在高版本谷歌Chrome浏览器中用VLC播放海康、大华RTSP实时视频?

一、背景 随着互联网基础设施的完善以及4G、5G等技术的大规模商用&#xff0c;在Chrome、Firefox、Edge等浏览器播放RTSP视频流也慢慢成为了信息化系统的行业标准。 早些年还可用VLC播放器在网页中播放RTSP视频流&#xff0c;好景不长&#xff0c;2015年Chrome、Firefox等浏览…

MySQL 视图(详解) navicat如何创建视图

文章目录MySQL 视图&#xff08;详解一&#xff0c;视图概念使用视图的原因二&#xff0c;创建视图&#xff08;1&#xff09;基本语法&#xff08;2&#xff09;创建基于单表的视图【实例 1】【实例 2】&#xff08;3&#xff09;创建基于多表的视图【实例 3】&#xff08;4&a…

使用set集合去除重复元素@EqualsAndHashCode注解

如何使用set集合去重 ​ 我们都知道&#xff0c;set集合是无序的&#xff0c;这样也导致set集合里面的元素是不能重复的&#xff0c;因为这一个特性&#xff0c;所以我们经常用set集合进行去重操作&#xff0c;我们下面以一个简单的例子说明set集合是如何进行去重的。 创建去…

BigDecimal 类的 compareTo() 和 equals()方法

BigDecimal 类的 compareTo() 和 equals()方法 1. compareTo()源码 /*** Compares this BigDecimal with the specified BigDecimal. * Two BigDecimal objects that are equal in value but have * a different scale (like 2.0 and 2.00) are considered equal* by this met…

缺少构造方法:Cause java.sql.SQLDataException Unsupported conversion from LONG to java.sql.Timestamp

今天遇到了一个奇怪的错误&#xff0c;报错如下图所示&#xff1a; org.springframework.dao.DataIntegrityViolationException: Error attempting to get column question_id from result set. Cause: java.sql.SQLDataException: Unsupported conversion from LONG to java…

Collectors.reducing总结Collectors.mapping+Collectors.reducing+TreeSet等等

Collectors.reducing总结 1. 方法签名 一个参数 public static <T> Collector<T, ?, Optional<T>> reducing(BinaryOperator<T> op)参数说明 BinaryOperator op 归集操作函数 输入参数T返回T 测试代码 我们这里实现一个简单的求和功能&#xff0…

vim退出快捷键

退出vim的快捷键 不需要进入命令编辑模式 按住shift zz 保存退出 zq 不保存退出&#xff0c;q表示放弃 之所以按住shift&#xff0c;其实是切换大小写 在命令编辑模式下&#xff1a; :q 不保存退出 :q! 不保存强制退出 :wq 保存退出&#xff0c;w表示写入&#xff0c;…

SpringBoot瘦身打包部署

一、前言 最近做的项目由于引入第三方库导致在运行mvn clean package 打jar时&#xff0c;编译出来的 Jar 包很大&#xff08;服务器多达500MB&#xff09;。 二、瘦身前的Jar包 SpringBoot编译出来的Jar包中&#xff0c;磁盘占用大的&#xff0c;是一些外部依赖库&#xff…

XShell直接拖拽文件到服务器,不使用Xftp等文件上传工具

很多情况下&#xff0c;我们使用 Xshell 工具时&#xff0c;如果遇到文件的上传和下载会不可避免的要用到另外一个工具 Xftp&#xff0c;但是频繁的使用 Xftp 会比较麻烦&#xff0c;那么有没有一种更加直接简单的方法呢&#xff1f; 当我们所需要上传的文件比较小的时候&…

System.getProperty()方法获取系统变量

今天在阅读JDBC的DriverManager类源码时&#xff0c;看到了这么一句代码&#xff1a; System.getProperty(“jdbc.drivers”)&#xff1b;getProperty()这个方法是获取指定键指示的系统属性的&#xff0c;也就是说上面的代码获取的是jdbc.drivers这个属性。我写了个测试测试输…

Spring Boot集成Druid异常discard long time none received connection.

Spring Boot集成Druid异常 在Spring Boot集成Druid项目中&#xff0c;发现错误日志中频繁的出现如下错误信息&#xff1a; discard long time none received connection. , jdbcUrl : jdbc:mysql://******? useSSLfalse&allowPublicKeyRetrievaltrue&useUnicodetrue…