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

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 { ... }是两个语法糖的组合:

  1. ?.是安全调用操作符:只有当tracker不为null时,才会执行后面的let函数;如果tracker是null,整个表达式直接返回null,不会执行lambda里的逻辑。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:07:05