如何将带返回值的Java BiFunction Lambda改为无返回值Lambda?
问题描述
我有一段用于创建和修改数据的Java代码,当前使用BiFunction类型的Lambda表达式,该Lambda会返回startTime变量。我希望将其改为无返回值(void)的Lambda,但尝试去掉BiFunction声明后,closeToken()等方法出现编译错误,因为tokenId变量被识别为Lambda类型而非String类型。请问如何实现?
原代码如下:
BiFunction<String, User, Long> closeTokenFunc = (tokenId, user) -> { long startTime = System.currentTimeMillis(); TokenList tokenList = issuanceManager.searchAssociatedToken(tokenId, user); List<String> associatedInstruments = tokenList.getTokens().stream().map(token -> token.getTokenNumber()).collect(Collectors.toList()); List<BatchRequestItem<TspBatchItemData>> items = createdTspBatch.getItems(); for (int i = 0, j = 0; i < associatedInstruments.size() && j < items.size(); i++, j++) { BatchRequestItem<TspBatchItemData> item = items.get(j); item.getItemDetails().setEnrollmentId(associatedInstruments.get(i)); item.save(); batchItemIdsToValidate.add(item.getId()); if (i == associatedInstruments.size() - 1) { i = 0; } } try { queryHelper.updateInstrumentState(tokenId, "PENDING_ACTIVE"); } catch (Exception e) { e.printStackTrace(); Assert.fail("Exception - thrown - " + e.getMessage()); } issuanceManager.closeToken(tokenId, TokenCloseRequest.TokenClosureReason.CLOSED, user); return startTime; };
解决方法
核心是用**BiConsumer**替代BiFunction,因为BiConsumer是专门接收两个输入参数、无返回值的函数式接口,完全匹配你需要的void Lambda场景。具体修改步骤:
- 修改变量的函数式接口类型:把
BiFunction<String, User, Long>换成BiConsumer<String, User>,明确告诉编译器这个Lambda接收String和User类型的参数,且无返回值。 - 删除返回语句:去掉Lambda里的
return startTime;,因为BiConsumer不允许返回值。
修改后的完整代码:
BiConsumer<String, User> closeTokenFunc = (tokenId, user) -> { long startTime = System.currentTimeMillis(); TokenList tokenList = issuanceManager.searchAssociatedToken(tokenId, user); List<String> associatedInstruments = tokenList.getTokens().stream().map(token -> token.getTokenNumber()).collect(Collectors.toList()); List<BatchRequestItem<TspBatchItemData>> items = createdTspBatch.getItems(); for (int i = 0, j = 0; i < associatedInstruments.size() && j < items.size(); i++, j++) { BatchRequestItem<TspBatchItemData> item = items.get(j); item.getItemDetails().setEnrollmentId(associatedInstruments.get(i)); item.save(); batchItemIdsToValidate.add(item.getId()); if (i == associatedInstruments.size() - 1) { i = 0; } } try { queryHelper.updateInstrumentState(tokenId, "PENDING_ACTIVE"); } catch (Exception e) { e.printStackTrace(); Assert.fail("Exception - thrown - " + e.getMessage()); } issuanceManager.closeToken(tokenId, TokenCloseRequest.TokenClosureReason.CLOSED, user); // 移除了return startTime;语句 };
报错原因说明
直接去掉BiFunction声明时,编译器无法推断Lambda的目标函数式接口类型,导致对参数tokenId的类型识别混乱——它不知道这个Lambda应该接收什么类型的参数,所以错误地把tokenId识别成了Lambda本身的类型,而非你预期的String类型。指定BiConsumer<String, User>后,编译器就能明确参数类型,自然不会再报错。
内容的提问来源于stack exchange,提问作者Sahil__
相关产品推荐
相关产品推荐

