Android Kotlin代码转Java及语法疑问:tracker?.let与init等价实现
没问题,我来帮你把这段Kotlin代码转换成Java,同时详细解释你关心的两个语法点:
转换后的Java代码
public class MainAdapter extends RecyclerView.Adapter<MainAdapter.ViewHolder> { private List<Integer> list = new ArrayList<>(); private SelectionTracker<Long> tracker; public MainAdapter() { setHasStableIds(true); } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { Integer number = list.get(position); if (tracker != null) { holder.bind(number, tracker.isSelected((long) position)); } } // 补充ViewHolder的基础实现(原Kotlin代码省略部分) public static class ViewHolder extends RecyclerView.ViewHolder { public ViewHolder(@NonNull View itemView) { super(itemView); } public void bind(Integer number, boolean isSelected) { // 这里写绑定数据、更新选中状态UI的逻辑,比如设置文本、背景色等 } } // 重写RecyclerView.Adapter必须实现的其他方法 @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { // 根据实际布局文件创建ViewHolder,这里用示例布局名占位 View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_main, parent, false); return new ViewHolder(view); } @Override public int getItemCount() { return list.size(); } @Override public long getItemId(int position) { // 因为设置了setHasStableIds(true),需返回唯一的itemId,这里用position作为示例 return position; } // 添加list的setter方法,对应Kotlin的var属性 public void setList(List<Integer> list) { this.list = list; notifyDataSetChanged(); } // 添加tracker的setter方法 public void setTracker(SelectionTracker<Long> tracker) { this.tracker = tracker; } }
关于Kotlin init代码块的Java等价实现
Kotlin里的init代码块是类实例化时一定会执行的初始化逻辑,不管你调用哪个构造函数创建对象。在Java里没有专门的init块语法,我们通常这么处理:
- 如果类只有一个构造函数,直接把
init里的代码写到这个构造函数里就行,比如上面代码中public MainAdapter()里的setHasStableIds(true),和原Kotlin的init块效果完全一致。 - 如果类有多个构造函数,为了避免重复代码,可以把初始化逻辑抽成一个私有方法,让所有构造函数都调用这个方法。
关于Kotlin tracker?.let的Java写法
Kotlin的tracker?.let { ... }是两个语法糖的组合:
?.是安全调用操作符:只有当tracker不为null时,才会执行后面的let函数;如果tracker是null,整个表达式直接返回null,不会执行lambda里的逻辑。let是作用域函数:把当前非null的tracker作为参数传入lambda(也就是lambda里的it),让你在lambda里直接操作这个对象。
对应到Java里,我们需要手动做null检查,然后在代码块里使用tracker对象,等价写法就是:
if (tracker != null) { // 原lambda里的逻辑,把it换成tracker即可 holder.bind(number, tracker.isSelected((long) position)); }
这种写法和Kotlin的tracker?.let逻辑完全一致,都是只有当tracker不为null时才执行绑定选中状态的逻辑。
内容的提问来源于stack exchange,提问作者A4_TS
相关产品推荐
相关产品推荐

