You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将带返回值的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场景。具体修改步骤:

  1. 修改变量的函数式接口类型:把BiFunction<String, User, Long>换成BiConsumer<String, User>,明确告诉编译器这个Lambda接收String和User类型的参数,且无返回值。
  2. 删除返回语句:去掉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__

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 13:17:22