一、需求概述
- 示例对象代码
List<User> users = new ArrayList<Person>(); users.add(new User().setAge("20").setPhoneNumber("12345678901")); users.add(new User().setAge("30").setPhoneNumber("10203040506"));
复制
- 需求
安全起见,手机号码只显示前6位
二、解决方案
2.1、方案一:Stream().map()
users = users.stream().map(u -> { u.setPhoneNumber(u.getPhoneNumber() != null ? u.getPhoneNumber().substring(0, 6) : null); return u;}).collect(Collectors.toList());
复制
2.2、方案二:forEach()
users.forEach(u -> u.setWorkUserId(u.getWorkUserId() == null ? u.getWorkUserId().substring(0, 6) : null));
复制
2.3、方案三:sql
如果数据是从数据库查询出来的,那最好的方式是在sql处进行截取。
此处以postgresql为例
select age, substring(u.phone_number from 1 for 6) phoneNumber from user_table;
复制
三、遇到问题
- 问题描述
在使用方案一时,代码如下编写,会报错:no instance(s) of type variable(s) R exist so that void conforms to R
users = users.stream().map(u -> u.setPhoneNumber(u.getPhoneNumber() != null ? u.getPhoneNumber().substring(0, 6) : null)) .collect(Collectors.toList());
复制
- 问题分析
点进去map()可以看到源码如下:
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
由源码可知:map()是要一个返回值R的,而以上写法是没有返回值的
- 问题解决
添加返回值即可
users = users.stream().map(u -> { u.setPhoneNumber(u.getPhoneNumber() != null ? u.getPhoneNumber().substring(0, 6) : null); return u;}).collect(Collectors.toList());
复制