Java中是否存在类似Kotlin also或apply的构造,可操作对象后返回该对象?
Java中是否存在类似Kotlin also或apply的构造,可操作对象后返回该对象?
嘿,这个问题问到点子上了!咱们先梳理下你的场景:你写的ok2方法是先创建A实例,调用它的fun方法(返回int),再把A实例返回;而nok里想写成链式调用,但因为fun返回的是int,没法直接作为A类型返回,你希望能让编译器自动处理成ok2的逻辑,对吧?
Java本身并没有像Kotlin的also或apply那样内置的语法糖,但咱们可以自己实现类似的效果,有两种常见方式:
1. 写一个通用工具类
你可以创建一个工具类,提供一个通用的also方法,接收对象和一个消费型lambda,执行完lambda里的操作后返回原对象:
import java.util.function.Consumer; public class ObjectUtils { public static <T> T also(T obj, Consumer<T> action) { action.accept(obj); return obj; } }
这样你的nok方法就可以改成:
A nok() { return ObjectUtils.also(new A(), A::fun); }
这段代码的逻辑和ok2完全一致:先创建A实例,调用它的fun方法,最后返回这个A实例,完美解决了返回类型不匹配的问题。
2. 给类A添加专属的also方法
如果你有权限修改A类的代码,可以直接在类里加一个类似的方法:
import java.util.function.Consumer; class A { public A() {} public int fun() { return 0; } // 新增的also方法 public A also(Consumer<A> action) { action.accept(this); return this; } }
调用起来就更简洁了:
A nok() { return new A().also(A::fun); }
顺便说一句,这种方式本质上就是模拟Kotlinalso的行为——不管你在lambda里调用的方法返回什么,最终都会把原对象返回。如果是第三方类没法修改的话,第一种工具类的方式就更灵活啦。
备注:内容来源于stack exchange,提问作者chris01
相关产品推荐
相关产品推荐

