Java9中对集合类扩展的of方法解析
Java9 集合类扩展of方法
package com.jd.collections; import org.junit.Test; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.stream.IntStream; import java.util.stream.Stream; public class StreamTest { @Test public void testSet() { Set<Integer> integerSet = Set.of(1, 2, 3, 4, 5, 6, 7, 8); System.out.println(integerSet); } @Test public void testList() { List<Integer> integerSet = List.of(1, 2, 3, 4, 5, 6, 7, 8); System.out.println(integerSet); } @Test public void testMap() { Map<String, String> stringMap = Map.of("k1", "v1", "k2", "v2", "k3", "v3"); System.out.println(stringMap); Map.Entry<String, String> entry1 = Map.entry("k1", "v1"); Map.Entry<String, String> entry2 = Map.entry("k11", "v11"); Map.Entry<String, String> entry3 = Map.entry("k12", "v12"); Map<String, String> mapOfEntries = Map.ofEntries(entry1, entry2, entry3); System.out.println(mapOfEntries); } @Test public void testStream1() { Optional<Integer> integerOptional = Stream.ofNullable(Integer.valueOf("1232")).findAny(); System.out.println(integerOptional.get()); } @Test public void testStream2() { Stream.of(1, 2, 3, 4, 5, 6).dropWhile(x -> x == 6)/*.takeWhile(x -> x == 2)*/.forEach(System.out::println); } @Test public void testStream3() { IntStream.of(1, 2, 3, 4, 5, 6).forEach(System.out::println); } @Test public void testStream4() { IntStream.iterate(1, i -> i < 10, i -> i + 2).forEach(System.out::println); } // @Test // public void testFlow() { // Flow.Processor // } }
Java9集合类中重载多个of方法原因
在java9 api的集合类中,有很多看似一样的重载of方法:
那这里有个问题是为什么有了VarArgs(可变长参数)方法,还需要定义那么多重载的方法呢?查看官方的更新日志中可以发现
有如下描述
http://openjdk.java.net/jeps/269
These will include varargs overloads, so that there is no fixed limit on the collection size. However, the collection instances so created may be tuned for smaller sizes. Special-case APIs (fixed-argument overloads) for up to ten of elements will be provided. While this introduces some clutter in the API, it avoids array allocation, initialization, and garbage collection overhead that is incurred by varargs calls. Significantly, the source code of the call site is the same regardless of whether a fixed-arg or varargs overload is called.
大致得意思是,虽然重载了这么多of方法会造成api的混乱,但它避免了varargs调用引起的数组分配,初始化和垃圾收集开销。因为固定参数的重载方法,返回的是一个immutable list(不可变集合)。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
Java日志logback的使用配置和logback.xml解读
这篇文章主要介绍了Java日志logback的使用配置和logback.xml解读,具有很好的价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2023-06-06Java Thread中start()和run()的区别_动力节点Java学院整理
start() : 它的作用是启动一个新线程,新线程会执行相应的run()方法。start()不能被重复调用。而run() : run()就和普通的成员方法一样,可以被重复调用。下面通过示例代码给大家介绍了Java Thread中start()和run()的区别,感兴趣的朋友一起看看吧2017-05-05Spring Cloud Gateway 内存溢出的解决方案
这篇文章主要介绍了Spring Cloud Gateway 内存溢出的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-07-07Java SpringBoot整合shiro-spring-boot-starterqi项目报错解决
这篇文章主要介绍了Java SpringBoot整合shiro-spring-boot-starterqi项目报错解决,文章围绕主题展开详细的内容介绍,具有一定的参考一下2022-08-08SpringBoot中@ConditionalOnBean实现原理解读
这篇文章主要介绍了SpringBoot中@ConditionalOnBean实现原理,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2023-02-02
最新评论