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
相关产品推荐
相关产品推荐

