1. 前言
之前原来的程序因为被同事新加了功能有些改动,结果测试告诉我原来的功能出现了Bug,找半天没找出来,后来发现问题出现在了stream.filter中
2. 坑点
对于List数据源的筛选,有两种常见方式:
- 第一种是
List.removeIf()
,过滤掉 符合 条件的,这种方式不会改变List的引用地址,直接在原有地址上进行数据过滤 - 第二种则是
List.stream().filter()
,过滤掉 不符合 条件的,官方解释是会返回一个新的stream流
我的理解是新的stream流是一个新的数据源,但实际上新的stream流只是改变了引用地址,但内部数据源的元素地址都还是原来的
换句话说不管是用 List.stream().filter().collect(Collectors.toList())
还是 List.stream().filter().findFirst()
,获得的对象如果使用get()对内部元素数据进行了更改,那么List原来的数据源也会改变,所以在对数据源进行改动的时候,一定要考虑到该数据源是否在别的地方还有引用