JDK 9~11 在语言语法方面有一个小改动,增长了至关数量的新API,这一节讲解下JDK1.8以后新增的一些API。java
自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 异常。es6
Stream 是 Java 8 中的新特性,Java 9 开始对 Stream 增长了如下 4 个新方法。json
@Test
public void test1() {
long count = Stream.ofNullable( null ).count();
System.out.println(count);
}
复制代码
takeWhile:从集合开头提取符合条件的元素api
@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);
}
复制代码
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);
}
复制代码
Opthonal也增长了几个很是酷的方法,如今能够很方便的将一个可选转换成一个Stream,或者当一个空可选时给它一个替代的。ui
@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);
}
复制代码
InputStream终于有了一个很是有用的方法:transferTo,能够用来将数据直接传输到OutputStream,这是在处理原始数据流时很是常见的一种用法。es5
@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();
}
}
复制代码
这是Java 9开始引入的一个处理HTTP请求的的化化HTTP Client API,该API支持同步和异步,而在Java 11中已经为正式可用状态,你能够在java.net包中找到这个API。spa
@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();
}
}
复制代码
欢迎扫码或微信搜索公众号《程序员果果》关注我,关注有惊喜~