摸不着头脑,flatMap处理后居然无法去重(原来是数据库添加字段的时候多了个空格= =)
程序员文章站
2022-07-10 18:13:58
前言这应该是一个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集合。一本书的作者可能会有多个,我选择使用;(冒号),把每一个作者隔开。
问题来了,这是结果图:
分号使用得很成功,但无论是Set还是distinct,都无法完成去重。
于是我做了三个测试
第一个测试
使用原始字符集合测试:
毫无意外,测试成功了,使用distinct就可以圆满完成任务。
所以我猜测是不是因为自定义类型的问题?
第二个测试
使用自定义book(并和我的原始book一样,使用@Data注解)
开始测试:
这里使用的是Set,很完美的结果。
似乎回到原点了,我依然不清楚到底是什么导致我无法去重,于是我开始测试其他属性,例如:分类Id。
第三个测试
分类id:
这次总算没让我大跌眼镜,终于就在这时,我想起来了会不会是我复制粘贴的时候,字符串多了空格?导致匹配失败的?
我去数据库看了看,发现作者后面还真是多了一个空格,到此问题终于解决了。(小白落泪)。在知道原因后,看控制台也发现一个字符也确实比后面的多了一个空格。(恨不得给自己打一耳光,浪费了一个小时多的时间。比起人脑,机器是不可能出错的啊)
结尾的小总结
复制粘贴也不是一定可靠,尤其是在网页复制粘贴的时候(会有很多奇奇怪怪的空格)
处理字符串需要特别严谨:
- null和""不是一回事。
- 处理前应该把左右两边的空格去掉。
集合也是一样,null和size() == 0 也不是同一件事。
stream处理后的集合的值不可能会是null,但size()可能是0。
本文地址:https://blog.csdn.net/Asteroid666/article/details/109583799