如何在java 8 stream api中初始化Collectors.toList()?

mem*_*und 2 java java-8 java-stream

我想根据过滤器收集物品.但如果未找到匹配项,则不应初始化结果列表.我更喜欢null而不是空列表.

List<String> match = list
            .stream()
            .filter(item -> item.getProperty == "match")
            .collect(Collectors.toList());

if (match != null && !match.isEmpty()) {
    //handle seldom match
}
Run Code Online (Sandbox Code Playgroud)

问题:大多数时候我没有匹配,导致空集合.这意味着即使我不需要,列表也会在大多数情况下实例化.

Mal*_*alt 5

Collecto.toList()分配一个List使用ArrayList::new,这是一个非常便宜的操作,因为ArrayList在插入元素之前实际上不会分配后备数组.所有构造函数都将内部Object[]字段初始化为静态创建的空数组的值.只有插入第一个元素时,实际的后备阵列才会初始化为"初始大小".

那么为什么要经历避免这种建设的痛苦呢?这听起来像是一个不成熟的优化.

如果您对GC压力如此担心,请不要使用Streams.与列表相比,流和收集器本身的创建成本可能要高得多.

  • @Nikolas afaik,这是Java 8中引入的一个优化,在观察到空的`ArrayList`实例飞来飞去之后很常见. (3认同)