Java9新特性系列(便利的集合工厂方法)

Java8前时代

在Java8版本以前,创建一个只读不可变的集合,先要初始化,然后塞数据,然后置为只读:

Set<String> set = new HashSet<>();
set.add("a");
set.add("b");
set.add("c");
set = Collections.unmodifiableSet(set);
复制代码

上面的方式占用太多行,能不能用单行表达式呢?用如下方式:

Set<String> set = Collections.unmodifiableSet(new HashSet<>(Arrays.asList("a", "b", "c")));
Set<String> set = Collections.unmodifiableSet(new HashSet<String>() {{
    add("a"); add("b"); add("c");
}});
复制代码

Java8

在Java8中可以用流的方法创建,具体可以看之前的一篇文章Java8新特性系列(Stream),实现方法如下:

Set<String> set = Collections.unmodifiableSet(Stream.of("a", "b", "c").collect(toSet()));
复制代码

Java9

Java9中引入了很多方便的API,Convenience Factory Methods for Collections,即集合工厂方法,官方Feature,上述的实现中Java9中有如下实现方式:

Set<String> set = Collections.unmodifiableSet(new HashSet<String>() {{
    add("a"); add("b"); add("c");
}});
复制代码

也可以用如下方式:

Set<String> set = Set.of("a", "b", "c");
复制代码

Java9中List提供了一系列类似的方法:

/**
 * Returns an immutable list containing zero elements.
 * @since 9
 */
static <E> List<E> of() {
    return ImmutableCollections.List0.instance();
}

/**
 * Returns an immutable list containing one element.
 * @since 9
 */
static <E> List<E> of(E e1) {
    return new ImmutableCollections.List1<>(e1);
}

/**
 * Returns an immutable list containing one element.
 * @since 9
 */
static <E> List<E> of(E e1) {
    return new ImmutableCollections.List1<>(e1);
}

/**
 * Returns an immutable list containing three elements.
 * @since 9
 */
static <E> List<E> of(E e1, E e2, E e3) {
    return new ImmutableCollections.ListN<>(e1, e2, e3);
}

...

/**
 * Returns an immutable list containing ten elements.
 * @since 9
 */
static <E> List<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9, E e10) {
    return new ImmutableCollections.ListN<>(e1, e2, e3, e4, e5, e6, e7, e8, e9, e10);
}

@SafeVarargs
@SuppressWarnings("varargs")
static <E> List<E> of(E... elements) {
    switch (elements.length) { // implicit null check of elements
        case 0:
            return ImmutableCollections.List0.instance();
        case 1:
            return new ImmutableCollections.List1<>(elements[0]);
        case 2:
            return new ImmutableCollections.List2<>(elements[0], elements[1]);
        default:
            return new ImmutableCollections.ListN<>(elements);
    }
}
复制代码

Java9中Set、Map都有类似的方法,创建只读不可变的集合:

Set.of()
...
Map.of()
Map.of(k1, v1)
Map.of(k1, v1, k2, v2)
Map.of(k1, v1, k2, v2, k3, v3)
...
Map.ofEntries(Map.Entry<K,V>...)
Map.Entry<K,V> entry(K k, V v)
Map.ofEntries(
    entry(k1, v1),
    entry(k2, v2),
    entry(k3, v3),
    // ...
    entry(kn, vn)
);
复制代码

微信公众号: 码上论剑
请关注我的个人技术微信公众号,订阅更多内容
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值