欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

摸不着头脑,flatMap处理后居然无法去重(原来是数据库添加字段的时候多了个空格= =)

程序员文章站 2022-03-31 08:20:41
前言这应该是一个bug。这是一篇毫无营养的博客。当我正在尝试从页面中获取作者时,发现之前应该被Set包装的作者字符串居然发生了重复,于是我赶紧回到源码处,并加了条log日志,开始排查问题我的代码是这样的:// 查作者(绝对也会有)Set collect2 = bookByCategoryId.stream().flatMap(book->{String author = book.getAuthor();String[] split = author.sp...

前言

这应该是一个bug。这是一篇毫无营养的博客。

当我正在尝试从页面中获取作者时,发现之前应该被Set包装的作者字符串居然发生了重复,于是我赶紧回到源码处,并加了条log日志,开始排查问题

我的代码是这样的:

// 查作者(绝对也会有)
Set<String> collect2 = bookByCategoryId.stream().flatMap(book->{
	String author = book.getAuthor();
	String[] split = author.split(";");
	return Arrays.asList(split).stream();			
}).distinct().collect(Collectors.toSet());

bookByCategoryId是我的book集合。一本书的作者可能会有多个,我选择使用;(冒号),把每一个作者隔开。

问题来了,这是结果图:

摸不着头脑,flatMap处理后居然无法去重(原来是数据库添加字段的时候多了个空格= =)
分号使用得很成功,但无论是Set还是distinct,都无法完成去重。

于是我做了三个测试

第一个测试

使用原始字符集合测试:

摸不着头脑,flatMap处理后居然无法去重(原来是数据库添加字段的时候多了个空格= =)
毫无意外,测试成功了,使用distinct就可以圆满完成任务。

所以我猜测是不是因为自定义类型的问题?

第二个测试

使用自定义book(并和我的原始book一样,使用@Data注解)

摸不着头脑,flatMap处理后居然无法去重(原来是数据库添加字段的时候多了个空格= =)
开始测试:

摸不着头脑,flatMap处理后居然无法去重(原来是数据库添加字段的时候多了个空格= =)
这里使用的是Set,很完美的结果。

似乎回到原点了,我依然不清楚到底是什么导致我无法去重,于是我开始测试其他属性,例如:分类Id。

第三个测试

分类id:

摸不着头脑,flatMap处理后居然无法去重(原来是数据库添加字段的时候多了个空格= =)

这次总算没让我大跌眼镜,终于就在这时,我想起来了会不会是我复制粘贴的时候,字符串多了空格?导致匹配失败的?

我去数据库看了看,发现作者后面还真是多了一个空格,到此问题终于解决了。(小白落泪)。在知道原因后,看控制台也发现一个字符也确实比后面的多了一个空格。(恨不得给自己打一耳光,浪费了一个小时多的时间。比起人脑,机器是不可能出错的啊)


结尾的小总结

复制粘贴也不是一定可靠,尤其是在网页复制粘贴的时候(会有很多奇奇怪怪的空格)

处理字符串需要特别严谨:

  1. null和""不是一回事。
  2. 处理前应该把左右两边的空格去掉。

集合也是一样,null和size() == 0 也不是同一件事。

stream处理后的集合的值不可能会是null,但size()可能是0。

本文地址:https://blog.csdn.net/Asteroid666/article/details/109583799