需求:List<对象>,修改对象的属性
一、需求概述
- 示例对象代码
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());
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




