Java9中对集合类扩展的of方法解析

目录
  • Java9 集合类扩展of方法
  • 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(不可变集合)。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Java中List.of()和Arrays.asList()的区别及原因分析

    目录 Java中List.of()和Arrays.asList()的区别及原因 1.Arrays.asList()可以插入null 2.用List.of的List自然是不包含null 3.List.of生成的List不能修改 4.关于数组修改对List的影响 原因 java listof报错处理 Java中List.of()和Arrays.asList()的区别及原因 动手写一下,让自己更有印象 1.Arrays.asList()可以插入null 而List.of()不可以 import jav

  • 浅析Java 9 Optional API 新增方法

    本文介绍Java 9 Optional API 新增方法.除了模块化,Java 9 也给Optional类增加了三个方法. 1. or 方法 有时当Optional为空时,我们想执行一些其他逻辑并也返回Optional.在Java9之前Optional类仅有orElse()和orElseGet()方法,但两者都返回非包装值. Java9引入or()方法当Optional为空时返回另一个Optional.如果Optional有定义值,则传入or方法的lambda不被执行: @Test public

  • Java9垃圾回收方法finalize() 原理解析

    1: finalize() 方法 finallize() 方法是Object类的方法, 用于在类被GC回收时 做一些处理操作, 但是JVM并不能保证finalize(0 ) 方法一定被执行, 由于finalize()方法的调用时机具有不确定性,从一个对象变得不可到达开始,到finalize()方法被执行,所花费的时间这段时间是任意长的.我们并不能依赖finalize()方法能及时的回收占用的资源,可能出现的情况是在我们耗尽资源之前,gc却仍未触发,因而通常的做法是提供显示的close()方法供客

  • Java9中对集合类扩展的of方法解析

    目录 Java9 集合类扩展of方法 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 ja

  • JavaWeb项目中dll文件动态加载方法解析(详细步骤)

    相信很多做Java的朋友都有过用Java调用JNI实现调用C或C++方法的经历,那么Java Web中又如何实现DLL/SO文件的动态加载方法呢.今天就给大家带来一篇JAVA Web项目中DLL/SO文件动态加载方法的文章. 在Java Web项目中,我们经常会用到通过JNI调用dll动态库文件来实现一些JAVA不能实现的功能,或者是一些第三方dll插件.通常的做法是将这些dll文件复制到 %JAVA_HOME%\jre\bin\ 文件夹或者 应用中间件(Tomcat|Weblogic)的bin

  • 解决phpmyadmin中缺少mysqli扩展问题的方法

    phpMyAdmin错误 缺少 mysqli 扩展.请检查 PHP 配置 的解决方案 phpMyAdmin 缺少 mysqli 扩展.请检查 PHP 配置 的解决方案: 缺少 mysqli 扩展.请检查 PHP 配置. 打开你的php.ini->一般在C:WINDOWS目录下. 找到 复制代码 代码如下: ;extension=php_msql.dll ;extension=php_mssql.dll extension=php_mysql.dll extension=php_mysqli.dl

  • 在iOS App中实现地理位置定位的基本方法解析

    iOS系统自带的定位服务可以实现很多需求.比如:获取当前经纬度,获取当前位置信息等等. 其定位有3种方式: 1,GPS,最精确的定位方式 2,蜂窝基站三角定位,这种定位在信号基站比较秘籍的城市比较准确. 3,Wifi,这种方式貌似是通过网络运营商的数据库得到的数据,在3种定位种最不精确 首先你要在你的Xcode中添加两个连接库,MapKit和CoreLocation,如图 core location提供了定位功能,能定位装置的当前坐标,同时能得到装置移动信息,最重要的类是CLLocationMa

  • Android Material设计中列表和卡片的创建方法解析

    5.0提供了两个新的Widget,它们使用了Material Design 的style和animation: RecyclerView 一个更可插拔式的ListView,它支持不同的布局类型,并且性能有了改进.(列表式) CardView 一个能让你在其内显示重要信息,并保持连贯的视觉和感觉的卡片.(卡片式) 它两位于 sdk/extras/android/support/v7/cardview 和 sdk/extras/android/support/v7/RecyclerView 创建列表

  • vue.js中ref及$refs的使用方法解析

    关于ref和$refs的用法及讲解,vue.js中文社区( https://cn.vuejs.org/v2/api/#ref )是这么讲解的: ref 被用来给元素或子组件注册引用信息,引用信息将会注册在父组件的 $refs 对象上. 如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素:如果用在子组件上,引用就指向组件: vue.js中文社区文档上的说明已经就比较通俗易懂了,其实我们可以这么理解,ref和$refs其实就是用来获取/操作DOM元素的:类似于jquey中的$(".xxx

  • python中下标和切片的使用方法解析

    下标 所谓下标就是编号,就好比超市中存储柜的编号,通过这个编号就能找到相应的存储空间. Python中字符串,列表,元祖均支持下标索引. 例如: # 如果想取出部分字符,可使用下标 name="abcd" print(name[0]) print(name[1]) print(name[2]) print(name[3]) # 输出结果为: # a # b # c # d 切片 切片是指对操作的对象截取一部分的操作,字符串,列表,元组均支持切片操作. 切片的语法:[起始:结束:步长]

  • iOS11中的定位授权的解决方法

    本文介绍了iOS11中的定位授权的解决方法,分享给大家,具体如下: 前台定位权限 1,增加NSLocationWhenInUseUsageDescription. 2,创建CLLocationManager对象,在使用定位服务前调用requestWhenInUseAuthorization(). 3,通过func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorization

  • ES6中的数组扩展方法

    form 转化为真正的数组 先说一下使用场景,在Js中,我们要经常操作DOM,比如获取全部页面的input标签,并且找到类型为button的元素,然后给这个按钮注册一个点击事件,我们可能会这样操作: var inputObjs=document.getElementsByTagName('input'); for(var i=0;i<inputObjs.length;i++){ if(inputObjs[i].type==='button'){ inputObjs[i].onclick=func

  • JavaScript中ES6字符串扩展方法

    es6这个String对象倒是扩展了不少方法,但是很多都是跟字符编码相关,个人选了几个感觉比较常用的方法: includes 搜索字符的神器 还记得我们之前如何判断某个字符串对象是否包含特地字符的吗? var str='google'; if(str.indexOf('o')>-1){ console.log('yes'); }else{ console.log('no'); } indexOf本来只是一个获取字符对应位置的方法,因为找到不到会返回-1这个值,就成了判断是否包含的方法,inclu

随机推荐