http://www.ox-holdings.com

Java 11新匍京娱乐场手机版: 长期支持,新版本为我们带来了很多新的语言特性

摘要美国时间2018年 09 月 25 日,Oralce 正式发布了 Java 11,这是据 Java 8 以后支持的首个长期版本。概述美国时间2018年09 月 25 日,Oralce 正式发布了 Java 11,这是 Java 8 发布以后支持的首个长期版本。为什么说是长期版本,看下面的官方发布的支持路线图表:可以看出 Java 8 扩展支持到 2025 年,而 Java 11 扩展支持到 2026 年。现在大部分都在用 Java 8,Java 9 和 10 目前很少有人在用,至少我没有发现有公司在生产环境应用的,那就是找死。现在 Java 11 长期支持,也已经包含了 9 和 10 的全部功能,9 和 10 自然就活到头了。。那么我们来看下 从 Java 9 - 11 都有哪些重要的新特性呢?1、本地变量类型推断这个博主已经写过一篇文章,详细的介绍了 Java 10 带来的这个新特性。什么是局部变量类型推断?varjavastack="javastack";System.out.println(javastack);大家看出来了,局部变量类型推断就是左边的类型直接使用 var 定义,而不用写具体的类型,编译器能根据右边的表达式自动推断类型,如上面的 String 。varjavastack="javastack";就等于:Stringjavastack="javastack";更多使用详情请参考这篇文章《Java 10 实战第 1 篇:局部变量类型推断》,这里不再重复了。2、字符串加强Java 11 增加了一系列的字符串处理方法,如以下所示。//判断字符串是否为空白"".isBlank(); //true//去除首尾空格"Javastack".strip(); //"Javastack"//去除尾部空格"Javastack".stripTrailing(); //"Javastack"//去除首部空格"Javastack".stripLeading(); //"Javastack"//复制字符串"Java".repeat(3);//"JavaJavaJava"//行数统计"AnBnC".lines().count();//33、集合加强自 Java 9 开始,Jdk 里面为集合(List/ Set/ Map)都添加了 of 和 copyOf 方法,它们两个都用来创建不可变的集合,来看下它们的使用和区别。示例1:varlist=List.of("Java","Python","C");varcopy=List.copyOf(list);System.out.println(list==copy);//true示例2:varlist=newArrayList<String>();varcopy=List.copyOf(list);System.out.println(list==copy);//false来看下它们的源码:static<E>List<E>of(E...elements){switch(elements.length){//implicitnullcheckofelementscase0:returnImmutableCollections.emptyList();case1:returnnewImmutableCollections.List12<>(elements[0]);case2:returnnewImmutableCollections.List12<>(elements[0],elements[1]);default:returnnewImmutableCollections.ListN<>(elements);}}static<E>List<E>copyOf(Collection<?extendsE>coll){returnImmutableCollections.listCopy(coll);}static<E>List<E>listCopy(Collection<?extendsE>coll){if(collinstanceofAbstractImmutableList&&coll.getClass()!=SubList.class){return(List<E>)coll;}else{return(List<E>)List.of(coll.toArray());}}可以看出 copyOf 方法会先判断来源集合是不是 AbstractImmutableList 类型的,如果是,就直接返回,如果不是,则调用 of 创建一个新的集合。示例2因为用的 new 创建的集合,不属于不可变 AbstractImmutableList 类的子类,所以 copyOf 方法又创建了一个新的实例,所以为false.注意:使用 of 和 copyOf 创建的集合为不可变集合,不能进行添加、删除、替换、排序等操作,不然会报 java.lang.UnsupportedOperationException 异常。上面演示了 List 的 of 和 copyOf 方法,Set 和 Map 接口都有。4、Stream 加强Stream 是 Java 8 中的新特性,Java 9 开始对 Stream 增加了以下 4 个新方法。1) 增加单个参数构造方法,可为nullStream.ofNullable(null).count();//02) 增加 takeWhile 和 dropWhile 方法Stream.of(1,2,3,2,1).takeWhile(n->n<3).collect(Collectors.toList());//[1,2]从开始计算,当 n < 3 时就截止。Stream.of(1,2,3,2,1).dropWhile(n->n<3).collect(Collectors.toList());//[3,2,1]这个和上面的相反,一旦 n < 3 不成立就开始计算。3)iterate重载这个 iterate 方法的新重载方法,可以让你提供一个 Predicate (判断条件)来指定什么时候结束迭代。如果你对 JDK 8 中的 Stream 还不熟悉,可以看之前分享的这一系列教程。5、Optional 加强Opthonal 也增加了几个非常酷的方法,现在可以很方便的将一个 Optional 转换成一个 Stream, 或者当一个空 Optional 时给它一个替代的。Optional.of("javastack").orElseThrow();//javastackOptional.of("javastack").stream().count();//1Optional.ofNullable(null).or(()->Optional.of("javastack")).get();//javastack6、InputStream 加强InputStream 终于有了一个非常有用的方法:transferTo,可以用来将数据直接传输到 OutputStream,这是在处理原始数据流时非常常见的一种用法,如下示例。varclassLoader=ClassLoader.getSystemClassLoader();varinputStream=classLoader.getResourceAsStream("javastack.txt");varjavastack=File.createTempFile("javastack2","txt");try(varoutputStream=newFileOutputStream(javastack)){inputStream.transferTo(outputStream);}7、HTTP Client API这是 Java 9 开始引入的一个处理 HTTP 请求的的孵化 HTTP Client API,该 API 支持同步和异步,而在 Java 11 中已经为正式可用状态,你可以在 java.net 包中找到这个 API。

集合的工厂方法

Java 9 新增了几种集合的工厂方法,可以大大简化集合的创建流程。使用工厂方法创建的集合不能再新增元素,如果新增元素,会报“java.lang.UnsupportedOperationException”异常。在 Java 8 中,我们创建集合并添加元素的时候,可能会写出如下的代码,重复而繁琐。

Set<Integer> sets = new Set<>();
sets.add(1);
sets.add(99);
sets.add(333);
List<String> list = new LinkedList<>();
list.add("hello");
list.add(",");
list.add("world");

在 Java 9 中,可以使用 of 方法直接创建集合并完成初始化。

Set<Integer> sets = Set.of(1,99,333);
List<String> list = List.of("hello",",","world");

public static String getName {

if (u == null)

return "Unknown";

return u.name;

}

private void init() { System.out.println("Initializing"); }

接口的私有方法

在前文《Java 8 | 接口的静态方法和默认方法》中,介绍了 Java 8 为接口新增的默认方法。而在 Java 9 中,接口定义的私有方法可以拥有方法体。这一改进,可以帮助接口的默认方法复用代码。比如 Java 8 的接口中可能存在一些重复的代码,如下所示。

public interface Inter{
    void test();
    default void check(){
        System.out.println("check");
    }
    default void check(int i){
        System.out.println("check");    
    }
}

在 Java 9 中,添加接口的私有方法,即可复用重复的代码。

public interface Inter{
    void test();
    default void check(){
        common();
    }
    default void check(int i){
        common();       
    }
    private void common(){
        System.out.println("check");
    }
}

它允许你在 Optional对象不包含值时提供一个默认值。

新匍京娱乐场手机版 1

改进的 Stream API

Java 9 为 Stream 新增了几个方法:dropWhile、takeWhile、ofNullable,为 iterate 方法新增了一个重载方法。

takeWhile 和 dropWhile 方法用于从 Stream 中获取一部分数据,接收一个 Predicate 来进行选择。在有序的 Stream 中,takeWhile 返回从开头开始的尽量多的元素;在无序的 Stream 中,takeWhile 返回从开头开始的符合 Predicate 要求的元素的子集。而 dropWhile 的行为与 takeWhile 相反,返回剩余的元素。

在如下的代码中,takeWhile 的筛选条件是数字小于 4,返回的是从开头开始的小于 4 的数字,最后的数字不会返回。

List<Integer> nums = List.of(1,2,3,5,7,1,2,3);
List<Integer> sub = nums
                    .stream()
                    .takeWhile(n -> n < 4)
                    .collect(Collectors.toList());
//jshell 执行结果 sub ==> [1, 2, 3]
List<Integer> sub2 = nums
                     .stream()
                     .dropWhile(n -> n < 4)
                     .collect(Collectors.toList());
//jshell 执行结果 sub2 ==> [5, 7, 1, 2, 3]

Java 8 中 Stream 不能包含 null,否则会报空指针异常,而 Java 9 中的 ofNullable 方法允许我们创建一个单元素 Stream,可以包含一个非空元素,也可以创建一个空 Stream。

Stream<String> stream = Stream.ofNullable("hello,world");
System.out.println(stream.count());
//jshell 执行结果 1
stream = Stream.ofNullable(null);
System.out.println(stream.count());
//jshell 执行结果 0

在 Java 8 中,iterate 方法可以用于生成一个 Stream,但是 iterate 方法本身产生的结果是无限的,因此还需要使用 limit 方法来确定 Stream 的大小。如下的代码,用于产生一个从 0 开始顺序递增的大小为 10 的 Stream。

List<Integer> numbers = Stream.iterate(0, i -> i+1) 
                     .limit(10) 
                     .collect(Collectors.toList());

在 Java 9 中新增了 iterate 的一个重载方法,第二个参数是一个 Predicate,可以用于控制返回 Stream 的大小。

//方法定义
static Stream iterate(T seed, Predicate hasNext, UnaryOperator next)

//使用示例
List<Integer> nums = Stream.iterate(0, i -> i < 10 ,i -> i+1)
                     .collect(Collectors.toList());
//jshell 执行结果 nums ==> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

分享学习笔记和技术总结,内容涉及 Java 进阶、架构设计、前沿技术、算法与数据结构、数据库、中间件等多个领域。关注作者第一时间获取最新内容,公众号同名(阅读体验更佳)。

List<String> wordList=Arrays.asList("H","E","L","L","O");

List<String> outputList=wordList.stream().map(String::toLowerCase).collect(Collectors.toList;

.GET()

Java 9 马上就要正式发布了,新版本为我们带来了很多新的语言特性。22 岁 的 Java 语言在面向对象领域几乎做到了极致,这篇文章根据官方文档和各种资料的内容,介绍 Java 9 的几个新的语言特性。

Java8

8. HTTP/2

Lambda结构.png

许多语言已经具有交互式编程环境,Java 现在加入了这个俱乐部。您可以从控制台启动 jshell ,并直接启动输入和执行 Java 代码。 jshell 的即时反馈使它成为探索 API 和尝试语言特性的好工具。

Java7

default void anotherDefaultMethod() { init(); }

依据一个非空值创建Optional

2. Linking

可接受null的Optional

Java 9 的定义功能是一套全新的模块系统。当代码库越来越大,创建复杂,盘根错节的“意大利面条式代码”的几率呈指数级的增长。这时候就得面对两个基础的问题: 很难真正地对代码进行封装, 而系统并没有对不同部分(也就是 JAR 文件)之间的依赖关系有个明确的概念。每一个公共类都可以被类路径之下任何其它的公共类所访问到, 这样就会导致无意中使用了并不想被公开访问的 API。此外,类路径本身也存在问题: 你怎么知晓所有需要的 JAR 都已经有了, 或者是不是会有重复的项呢? 模块系统把这俩个问题都给解决了。

在函数式接口上都可以使用Lambda表达式。

IntStream.iterate(1, i -> i < 100, i -> i + 1).forEach(System.out::println);

新匍京娱乐场手机版 2

module blog {

如以下短短一行命令,就实现了读取文件、转换小写字母、按字典排序、取最后三个字母这一串处理逻辑。

Stream s = Optional.of(1).stream();

filter对原始 Stream 进行某项测试,通过测试的元素被留下来生成一个新 Stream。

如果您使用默认方法开发 API ,那么私有接口方法可能有助于构建其实现。

构造

Set ints = Set.of(1, 2, 3);

forEach 方法接收一个 Lambda 表达式,然后在 Stream 的每一个元素上执行该表达式。

当启动一个模块化应用时, JVM 会验证是否所有的模块都能使用,这基于 `requires` 语句——比脆弱的类路径迈进了一大步。模块允许你更好地强制结构化封装你的应用并明确依赖。你可以在这个课程中学习更多关于 Java 9 中模块工作的信息 。

ifPresent(Consumer<? super T>)

第二个参数是一个 Lambda,它会在当前 IntStream 中的元素到达 100 的时候返回 true。因此这个简单的示例是向控制台打印 1 到 99。

Java8

HttpResponse resp = client.send(req, HttpResponse.BodyHandler.asString());

函数式接口即只定义一个抽象方法的接口。

multirelease.jar

Optional<Car> optCar=Optional.ofNullable;

如你所见,Java 9 提供了一大堆或大或小的功能特性,你准备好了么?

构造

4. 改进的 Javadoc

不懂得问题都可以在本群提出来 之后还会有职业生涯规划以及面试指导

default void interfaceMethodWithDefault() {  init(); }

声明一个空的optional

List strings = List.of("first", "second");

实例

HttpRequest.newBuilder(URI.create(""))

郑重声明:本文版权归新匍京a奥门-最全网站手机版app官方下载所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。