有这样的需求。当excel导出报告时,产品经理希望在第一列中添加序列号。可能大家都会问,你就不能直接取数据库的id吗?但是,会有问题。很多时候,当我们从数据库中获取数据时,我们也会将数据进行分组和其他业务操作。这样,这个id还会是我们想要的id吗?显然不是,有些身份证可能是10位数长度的分布式身份证。这是产品经理想要的吗?显然不是。
此时,Java8的流将出现在舞台上:
列表用户用户列表=新数组列表();
userList.add(新用户(' cxdcc ',' 05-07 ');
UserList.add(新用户(‘舒适之羽’,‘05-07’);
userList.add(新用户(' cxdcc ',' 05-06 ');
用户列表.添加(新用户('舒缓羽毛',' 05-06 ');
system . out . println(jsonobject . to jsonstring(user list));
//排序,将相同的名称放在一起,然后按时间排序。
用户列表=用户列表.流()。已排序(
比较器。比较(用户:获取用户名)。然后比较(用户:获取日期))。collect(collectors . tolist());
system . out . println(jsonobject . to jsonstring(user list));
//给列表的每个元素添加一个序号,如果Integer i=1,可以在这里尝试;把下一盘递给我,看看会发生什么。
整数[]arr={ 1 };
用户列表=用户列表.流()。peek(e-e.setId(arr[0])。collect(collectors . tolist());
system . out . println(jsonobject . to jsonstring(user list));打印结果:
[{'date':'05-07 ',' userName':'cxdcc'},
{ '日期' :' 05-07 ','用户名' : '放松羽毛' },
{'date':'05-06 ',' userName':'cxdcc'},
{ '日期' :' 05-06 ','用户名' : '放松羽毛' }]
[{'date':'05-06 ',' userName':'cxdcc'},
{'date':'05-07 ',' userName':'cxdcc'},
{ '日期' :' 05-06 ','用户名' : '放松羽毛' },
{ '日期' :' 05-07 ','用户名' : '放松羽毛' }]
[{'id':1,' date':'05-06 ',' userName':'cxdcc'},
{'id':2,'日期' :'05-07 ','用户名' :'cxdcc'},
{'ID' :3,'日期' :' 05-06 ','用户名' : '放松羽毛' },
{'ID' :4,'日期' :' 05-07 ','用户名' : '放松羽毛' }]
扩展
感兴趣的同学可以尝试将Integer数组改为Integer I=1;把下一套递给我。试试会发生什么。这时会发现里面全是1,没有1,2,3,4.自增操作的结果;
原因总结
这是为什么?因为Lambda表达式最终会被编译成匿名内部类,所以每个从事java的人都知道,如果在匿名内部类中调用外部变量,那么外部变量必须是final。这里如果是Integer的引用类型,就不会改变。如果是数组,它的引用不会改变,但是值可以通过自增量改变!