暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Java8-Stream: no instance(s) of type variable(s) R exist so that void conforms to R

原创 Oracle 2023-03-27
3224

一、需求概述

  • 示例对象代码

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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论