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

Kotlin如何为Stream链式调用添加自定义Consumer方法及替代方案

解决方案

你需要的是Stream API内置的peek操作,该操作专门用于在链式调用中插入无返回值的消费型逻辑(符合Consumer类型要求),执行自定义操作后会原样传递流元素到后续处理节点,完全匹配你的需求。

修改后可运行代码

// 先自定义你需要的异常类
class InvalidLengthException(message: String) : RuntimeException(message)

fun main(args: Array<String>) {
    val countries: List<String> = listOf("India", "Germany", "Japan")

    val firstCountry = countries.stream()
                                .filter{it == "Germany"}
                                // 直接用方法引用传入自定义的消费方法即可
                                .peek(::performOperation)
                                .findFirst()

    println(firstCountry)
}

// 自定义消费方法,无返回值符合Consumer要求
fun performOperation(country: String) {
    if(country.length > 3) {
        throw InvalidLengthException("Error")
    }
    // 执行其他自定义无返回操作
    doCustomOperation(country)
}

// 这里补全你自己的doCustomOperation实现即可
fun doCustomOperation(country: String) {
    // 你的业务逻辑
}

用map实现的替代方案(不推荐,仅作参考)

如果你确实需要用map达成同等效果,可以在map中执行完自定义操作后返回原元素,不过这种方式不符合map的语义(map设计用于元素类型转换),仅做兼容演示:

val firstCountry = countries.stream()
                            .filter{it == "Germany"}
                            .map { 
                                performOperation(it)
                                it // 执行完操作后原样返回元素,不改变后续处理逻辑
                             }
                            .findFirst()

该方式虽然可以正常运行,但语义不清晰,优先选择peek方案。

内容的提问来源于stack exchange,提问作者hades

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 15:27:03