【问题标题】:java collection without null object没有空对象的java集合
【发布时间】:2019-10-15 06:07:30
【问题描述】:

java中是否有不会添加空对象的集合?给定一个项目列表,查询这些项目的数据库,当从数据库返回结果时,如果它确实存在于数据库中,我会将项目添加到结果列表中,如果它不数据库返回 null,那么我将丢弃它.

我有以下代码:

reqIds.forEach(
        reqId -> {
          columnValueMap.clear();
          columnValueMap.put("request_id", reqId);
          EventAudit auditRecord =
              pollDatabaseFindByIdAndKey(
                  EventAudit.class, columnValueMap);

          if (auditRecord != null) {
            auditMap.put(auditRecord.getRequestId(), auditRecord);
          }
        });

我知道我可以使用 Java 流过滤器来过滤掉 null,但我想知道是否有任何智能集合会自动拒绝 null 对象,所以我不需要做额外的 Null 检查

【问题讨论】:

  • 可以使用google guavaapache commons等外部库,请看stackoverflow.com/questions/6433478/…
  • 没有你想要的。仅当您尝试添加 null 时引发异常的集合。实现这样的集合也不是一个好主意,因为静默丢弃数据并不是明显的行为,而 if (foo != null) add (foo) 清楚地说明了会发生什么。
  • 看起来你需要一张地图。根据github.com/google/guava/wiki/LivingWithNullHostileCollectionsConcurrentHashMap不允许nulls
  • @Sunchezz 你确定你会得到一个没有空对象的集合吗? Javadocs 明确指出:“此类允许空元素”
  • @RobertKock 你是对的。删除了我的评论。不知道这些知识是从哪里来的 :( 以为我在某处读过这个……

标签: java


【解决方案1】:

您可以使用 apache commons 集合来执行此操作,

import java.util.List;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.PredicateUtils;
import com.google.common.collect.Lists;

public class Test {
    public static void main(String[] args) {
        List<Integer> l = Lists.newArrayList(1, 2, 3, null, 7, null, 8, null);
        CollectionUtils.filter(l, PredicateUtils.notNullPredicate());
        System.out.println(l);
    }
}

上面的代码会像这样打印输出,

[1, 2, 3, 7, 8]

【讨论】:

    【解决方案2】:

    查看Collection的java-doc,它是add的定义:

    如果集合因任何原因拒绝添加特定元素 除了它已经包含该元素之外,它还必须抛出一个 异常(而不是返回 false)。这保留了不变量 在此之后集合始终包含指定元素 调用返回。

    NullPointerException - 如果指定元素为 null 并且 this 集合不允许空元素

    如您所见,这样的Collection 会破坏Collection 接口中定义的合约。您将不得不寻找第三方库来完成您想要的操作,但我强烈建议您不要使用这样的集合,因为当用户对其他集合感到满意时,它会破坏 principle of least astonishment 的几个假设。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多