Collections的方法emptySet()

java.util.Collections有几个方法,返回不可变的空集合。请问这种返回值有何用途?

Set set = Collections.emptySet();
 

System.out.println("set: " + set);
阅读 2.8k
3 个回答

其实就是有些时候,需要一个集合,只是需要一个集合而已,我不会修改这个集合,但是又需要它有集合的相关属性。


/**
 * 获取用户Id集合
 *
 * @param memberList 用户列表
 * @return Set<String>
 */
public Set<String> getMemberIds(List<Member> memberList) {
    return Optional.ofNullable(memberList)
            .map(members -> members.stream().map(Member::getNo).collect(Collectors.toSet()))
            .orElse(Collections.emptySet());
}

@Data
static class Member {
    private String no;
}

有时候我们在返回数据给前端的时候,可能会遇到各种判断然后返回或者最终返回空集合。
这个Set集合可不是HashSet,经查看源码可知道该方法是没有add操作的。并且所有相关的操作方法都是围绕着空去做的。

public static final <T> Set<T> emptySet() {
        return (Set<T>) EMPTY_SET;
    }

    /**
     * @serial include
     */
    private static class EmptySet<E>
        extends AbstractSet<E>
        implements Serializable
    {
        private static final long serialVersionUID = 1582296315990362920L;

        public Iterator<E> iterator() { return emptyIterator(); }

        public int size() {return 0;}
        public boolean isEmpty() {return true;}

        public boolean contains(Object obj) {return false;}
        public boolean containsAll(Collection<?> c) { return c.isEmpty(); }

        public Object[] toArray() { return new Object[0]; }

        public <T> T[] toArray(T[] a) {
            if (a.length > 0)
                a[0] = null;
            return a;
        }

        // Override default methods in Collection
        @Override
        public void forEach(Consumer<? super E> action) {
            Objects.requireNonNull(action);
        }
        @Override
        public boolean removeIf(Predicate<? super E> filter) {
            Objects.requireNonNull(filter);
            return false;
        }
        @Override
        public Spliterator<E> spliterator() { return Spliterators.emptySpliterator(); }

        // Preserves singleton property
        private Object readResolve() {
            return EMPTY_SET;
        }
    }

进行数据封装返回时,我确却的知道以后我只需要对这个数据进行查询,不需要增加删除;那就可以在数据为空时,直接返回 emptySet,emptyList,emptyMap...
这样做的好处就是上层应用在使用时就不需要判空了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题