关键词:
文章首发于公众号《程序员果果》
地址 : https://mp.weixin.qq.com/s/O0xntC-JfeSBk-9x2QfwnA
一、简介
JDK 9~11 在语言语法方面有一个小改动,增加了相当数量的新API,这一节讲解下JDK1.8之后新增的一些API。
二、增强API
1. 集合的增强api
自Java 9开始,Jdk里面为集合(List / Set / Map)都添加了of和copyOf方法,它们两个都用来创建不可变的集合,来看下它们的使用和区别。
/**
* List的增强api
*/
@Test
public void test1()
List<String> list = List.of( "aa", "bb", "cc", "dd" );
System.out.println( list );
// 抛出java.lang.UnsupportedOperationException 异常
list.add( "ee" );
System.out.println( list );
/**
* Set的增强api
*/
@Test
public void test2()
Set<Integer> set1 = Set.of( 100 , 30 ,20 ,15);
System.out.println(set1);
// 抛出java.lang.IllegalArgumentException: duplicate element: 20
Set<Integer> set2 = Set.of( 100 , 30 ,20 ,15 ,20 ,15 );
// 抛出java.lang.UnsupportedOperationException 异常
set2.add( 10 );
System.out.println(set2);
/**
* Map的增强api
*/
@Test
public void test3()
Map<String , Integer> map = Map.of("a" , 1 , "b" , 2 , "c" , 3);
// 抛出java.lang.UnsupportedOperationException 异常
map.put( "d" , 4 );
System.out.println(map);
使用of()方法创建的集合,为不可变集合,不能进行添加、删除、替换、排序等操作,不然会报 java.lang.UnsupportedOperationException 异常。
2. Stream的增强api
Stream 是 Java 8 中的新特性,Java 9 开始对 Stream 增加了以下 4 个新方法。
增加单个参数构造方法,可为null
@Test
public void test1()
long count = Stream.ofNullable( null ).count();
System.out.println(count);
增加 takeWhile 和 dropWhile 方法
takeWhile:从集合开头提取符合条件的元素
@Test
public void test2()
List<Integer> res = Stream.of( 1, 2, 3,4, 0, 1 )
.takeWhile( n -> n < 4 )
.collect( Collectors.toList() );
System.out.println(res);
dropWhile:从集合开头移除前符合条件的元素
@Test
public void test3()
List<Integer> res = Stream.of( 1, 2, 3,4, 0, 1 )
.dropWhile( n -> n < 4 )
.collect( Collectors.toList() );
System.out.println(res);
3. 字符串增强api
Java 11增加了一系列的字符串处理方法。
@Test
public void test1()
//判断字符串是否为空白
boolean res1 = " ".isBlank();
//true
System.out.println(res1);
//去除首尾空格
String res2 = " java ~ ".strip();
// "java ~"
System.out.println(res2);
//去除尾部空格
String res3 = " java ~ ".stripTrailing();
//" java ~"
System.out.println(res3);
//去除首部空格
String res4 = " java ~ ".stripLeading();
//"java ~ "
System.out.println(res4);
//复制字符串
String res5 = "java".repeat( 3 );
// "java"
System.out.println(res5);
//行数统计
long res6 = "A\\nB\\nC".lines().count();
//3
System.out.println(res6);
4. Optional增强api
Opthonal也增加了几个非常酷的方法,现在可以很方便的将一个可选转换成一个Stream,或者当一个空可选时给它一个替代的。
@Test
public void test1()
//java ~
String res1 = Optional.of( "java ~" ).orElseThrow();
System.out.println(res1);
//1
long res2 = Optional.of( "java ~" ).stream().count();
System.out.println(res2);
//java ~
Object res3 = Optional.ofNullable( null )
.or( () -> Optional.of( "java ~" ) )
.get();
System.out.println(res3);
5. 输入流增强api
InputStream终于有了一个非常有用的方法:transferTo,可以用来将数据直接传输到OutputStream,这是在处理原始数据流时非常常见的一种用法。
@Test
public void test1()
try
InputStream inputStream = TestInputStream.class.getClassLoader().getResourceAsStream("test.txt");
var file = new File("/Users/xxx/test2.txt");
try (var outputStream = new FileOutputStream(file))
inputStream.transferTo(outputStream);
catch (IOException e)
e.printStackTrace();
6. HTTP客户端增强api
这是Java 9开始引入的一个处理HTTP请求的的化化HTTP Client API,该API支持同步和异步,而在Java 11中已经为正式可用状态,你可以在java.net包中找到这个API。
@Test
public void test1()
try
var request = HttpRequest.newBuilder()
.uri( URI.create("http://t.weather.sojson.com/api/weather/city/101020100"))
.GET()
.build();
var client = HttpClient.newHttpClient();
// 同步
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
//异步
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.thenAccept(System.out::println)
.join();
catch (Exception e)
e.printStackTrace();
关注我
欢迎扫码或微信搜索公众号《程序员果果》关注我,更多精彩内容不能错过 ~~
(转载本站文章请注明作者和出处 程序员果果的博客)
第四篇:记录相关操作(代码片段)
一介绍MySQL数据操作:DML========================================================在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包括使用INSERT实现数据的插入UPDATE实现数据的更新使用DELETE实现数据的删除使用SELECT查询数据... 查看详情
第四篇集合与容器(代码片段)
packagecom.zzp.demo.myCollection;/****用于HashMap*@authorjava**/publicclassNode2 inthash; Objectkey; Objectvalue; Node2next; packagecom.zzp.demo.myCollection;/****自定义HashMap*@authorjava**/public 查看详情
abp异常处理第四篇(代码片段)
异常ABP异常分类 ABP的异常基类源代码ABPException的源代码如下///<summary>///BaseexceptiontypeforthosearethrownbyAbpsystemforAbpspecificexceptions.///</summary>[Serializable]publicclassAbpException:Exceptio 查看详情
第四篇io流技术(代码片段)
packagecom.zzp.demo01;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.IOException;importjava.io.InputStream;/****第一个程序理解操作步骤*1、创建源*2、选择流*3、操作*4、释放资源* 查看详情
jdk11新特性——新加的一些更实用的api(代码片段)
目录一、集合增强1.1、List集合of()方法1.2、Set集合of()方法1.3、Map集合of()方法1.4、List集合copyOf()方法1.5、of()和copyOf()方法创建集合的注意事项二、Stream增强2.1、Stream新增of()方法2.2、Stream新增ofNullable()方法2.3、Stream新增takeWhile()和dr... 查看详情
jdk11新特性——新加的一些更实用的api(代码片段)
目录一、集合增强1.1、List集合of()方法1.2、Set集合of()方法1.3、Map集合of()方法1.4、List集合copyOf()方法1.5、of()和copyOf()方法创建集合的注意事项二、Stream增强2.1、Stream新增of()方法2.2、Stream新增ofNullable()方法2.3、Stream新增takeWhile()和dr... 查看详情
第四篇博客(代码片段)
wcphahaha CSSGrid布局基础grid关键词解释 grid-template-columns: repeat(3,1fr):template:模板;column:纵列;repeat:重复;(3,1fr):将页面分成3纵列、每一列宽度为1fr(fr是自适应长度单位); grid-gap:10px:间隙大小10px; g... 查看详情
django第四篇(代码片段)
模板的继承:你首先继承一个html页面,继承了意味你拥有父模板所有的东西,你只需要在父模板的基础上修改布局即可第一步;在父模板划分多个区域%block给区域起的名字%父模板需要被重写或者重用的代码%endblock%第二步,在子... 查看详情
音视频大合集第四篇;走近音视频(代码片段)
前言关于音视频篇是那么有点长,关于音视频初识篇和初探篇已经完了,接下来是深入探索篇,还有一部分面试内容就要完结了。10.19-24音视频中高级52部+面试10.25-26高级Android组件化强化实战(一二)10.27-11... 查看详情
juc-共享模型之无锁-第四篇(代码片段)
四、共享模型之无锁1.本章内容CAS与volatile原子整数原子引用原子累加器Unsafe2.问题提出有如下需求,保证account.withdraw取款方法的线程安全packagecn.itcast;importjava.util.ArrayList;importjava.util.List;interfaceAccount//获取余额IntegergetBalance();//取... 查看详情
第四篇:文件处理(代码片段)
一、文件操作介绍计算机系统分为:计算机硬件,曹祖系统,应用程序三部分。我们用Python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序是... 查看详情
javaweb详解(第四篇)之jsp简介(代码片段)
JavaWeb详解(第四篇)之JSP简介1、JSP概述1.1、什么是JSP JSP全称是JavaServletPages,它是和servlet技术一样,都是SUN公司定义的一种用于动态开发web资源的技术。 JSP这门技术最大的特点在于,写JSP就像在写ht... 查看详情
kafka消息队列大数据实战教程-第四篇(kafka客户端producerapi)(代码片段)
文章目录前言一、创建生产者1.1引入Maven依赖包1.2构建Producer1.3消息acks应答机制1.3.1数据可靠性分析1.3.2数据完全可靠条件1.3.3数据重复分析1.3.4数据有序1.3.5数据乱序总结前言提示:本章我们将使用原生API客户端的方式来连接到Kaf... 查看详情
kafka消息队列大数据实战教程-第四篇(kafka客户端producerapi)(代码片段)
文章目录前言一、创建生产者1.1引入Maven依赖包1.2构建Producer1.3消息acks应答机制1.3.1数据可靠性分析1.3.2数据完全可靠条件1.3.3数据重复分析1.3.4数据有序1.3.5数据乱序总结前言提示:本章我们将使用原生API客户端的方式来连接到Kaf... 查看详情
第四篇:断路器(hystrix)(代码片段)
一、断路器简介。在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在SpringCloud可以用RestTemplate+Ribbon和Feign来调用。为了保证其高可用,单个服务通常会集群部署。由于网络原因或者自身... 查看详情
好玩的es--第四篇之聚合查询和集群(代码片段)
好玩的ES--第四篇之聚合查询和集群聚合查询简介测试数据使用根据某个字段分组求最大值求最小值求平均值求和整合应用集群集群Cluster相关概念集群<cluster>节点<node>索引<Index>映射<Mapping>文档<Document>分片&l... 查看详情
docker第四篇docker仓库管理(代码片段)
一、仓库概述仓库(Repository):仓库是集中存放镜像文件的场所,仓库分为公共仓库和私有仓库。注册服务器(Registry)和仓库区别:注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag... 查看详情
第四篇camunda系列-processengine核心对象(代码片段)
一、ProcessEngine ProcessEngine是Camunda流程引擎的核心。我们在流程中的很多具体的处理比如流程部署、流程部署、流程审批等操作都是通过XXXService来处理的。而相关的XXXService都是通过ProcessEngine来管理的。所以对于ProcessEngine的... 查看详情