【问题标题】:Value for map.compute is always nullmap.compute 的值始终为 null
【发布时间】:2022-02-03 06:34:10
【问题描述】:

我正在尝试在我的地图上使用 .compute(),但从未触发过 else 语句。

public void onInviteUser(int adapterPosition) {
        Log.d(TAG, "onInviteUser: " + adapterPosition); //not null
        mapInvitedFriends.compute(adapterPosition, (k, v) -> {
            Log.d(TAG, "onInviteUser: " + adapterPosition); 
            if (v == null) {
                Log.d(TAG, "onInviteUser: " + v);
                mapInvitedFriends.put(adapterPosition, listFriends.get(adapterPosition));
                Log.d(TAG, "onInviteUser: " + listFriends.get(adapterPosition).toString());
                return v;
            } else {
                //Never gets fired
                Log.d(TAG, "onInviteUser: " + v);
                mapInvitedFriends.remove(adapterPosition);
                return v;
            }
        });
}

我已经记录了所有内容,但我无法弄清楚为什么 v 的值始终为空。

编辑:

地图的类型是:

private final Map<Integer, Friend> mapInvitedFriends = new HashMap<>();
private final List<Friend> listFriends = new ArrayList<>();

【问题讨论】:

  • minimal reproducible example 在这里会非常有帮助 - 你还没有告诉我们任何关于 mapInvitedFriends 的事情 - 甚至没有告诉我们它的类型,或者是什么创造了它。
  • 添加了编辑
  • v 为空时,您的compute 方法返回null,这意味着您从不创建映射...

标签: java


【解决方案1】:

你没有正确使用compute

重映射函数不应在计算期间修改此映射。

因此,您不应在函数内部调用mapInvitedFriends.putmapInvitedFriends.remove

相反,您可以尝试:

    mapInvitedFriends.compute(adapterPosition, (k, v) -> {
        Log.d(TAG, "onInviteUser: " + adapterPosition); 
        if (v == null) {
            return listFriends.get(adapterPosition); // this will cause a new mapping to be added
        } else {
            return null; // this will cause the existing mapping to be removed
        }
    });

或者简单地说:

mapInvitedFriends.compute(adapterPosition,
                          (k, v) -> v == null ? listFriends.get(adapterPosition) : null);

【讨论】:

  • 哦,我现在明白了。感谢您清除它
猜你喜欢
  • 1970-01-01
  • 2021-05-29
  • 2012-11-23
  • 1970-01-01
  • 2020-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多