如何解决getOrDefault传抛异常lambda的函数式接口类型报错
错误原因
Map.getOrDefault 方法的签名为 V getOrDefault(Object key, V defaultValue),第二个参数要求传入和Map存储值类型一致的普通对象,不接收函数式接口类型的参数。你传入的lambda表达式没有匹配的函数式接口目标类型,因此编译器抛出对应错误。
另外这个方法本身也不适合你的需求:就算你强行把lambda执行后的结果传入,不管目标key是否存在,默认值逻辑都会在调用getOrDefault前先执行,会出现不管key存不存在都直接抛异常的问题。
你代码里异常信息的unkonwn是拼写错误,正确拼写为unknown,可以一并修正。
正确实现方式
你可以选两种常用写法实现需求:
- 写法1:先判空再赋值,逻辑直观无额外依赖
String fileType = uploadCertificateSchoolRequest.getTypeFile(); String mimeCode = CertificationsConstants.FILE_TYPES.get(fileType); if (mimeCode == null) { throw new IllegalStateException("unknown filetype"); } cliente.setMIMECode(mimeCode);
- 写法2:链式调用写法,借助
Optional实现key不存在时才触发抛异常的逻辑
cliente.setMIMECode( Optional.ofNullable(CertificationsConstants.FILE_TYPES.get(uploadCertificateSchoolRequest.getTypeFile())) .orElseThrow(() -> new IllegalStateException("unknown filetype")) );
内容的提问来源于stack exchange,提问作者BugsOverflow
相关产品推荐
相关产品推荐

