十分钟从Java 8到Java 15


十分钟从Java 8到Java 15

文章插图
> A path with many great news: from JAVA 8 to Java 15
该博客将为您提供自Java 7以来增加得很棒的新功能的示例 。我将展示每个Java版本的至少一项重大改进 , 一直到2020年秋季发布的Java 15都有 。Java现在完全支持lambda , 函数式编程 。 , 通过var , 具有简单构造函数的不可变集合以及多行字符串进行类型推断 。此外 , 还有令人兴奋的新实验功能 , 例如数据类(记录)和密封类 。最后 , 我将讨论Java REPL , 它为快速实验提供了很高的价值 。
目录:
  • 函数式编程(Java 8)
  • 流(Java 8)
  • 选项(Java 8)
  • JShell(Java 9)
  • 不可变集合的工厂方法(Java 9)
  • 使用var进行类型推断(Java 10)
  • 单一源文件启动(Java 11)
  • 转换表达式(Java 12:实验性 , 完整功能:Java 14)
  • 多行字符串(Java 13:实验性 , 完整功能:Java 15)
  • 数据类:记录(Java 14:实验性)
  • 不带Cast的instanceof(Java 14:实验性)
  • 密封类(Java 15:实验性)
  • 奖励:从Java 8开始更新的许可条款
  • 总结
函数式编程(Java 8)在Java 8中 , 功能编程和lambda被添加为语言功能 。函数式编程的两个核心范例是不变的值和将函数提升为一等公民的方法 。数据经过一系列修改步骤 , 其中每个步骤都需要一些输入并将其映射到新的输出 。函数式编程可与Java中的Streams和null安全monad(可选)一起使用 , 如下所示…
List<String> stringList = Arrays.asList("Hello", "World", "How", "Are", "You", "Today");//functional stylestringList.stream().filter(s -> s.equals("Hello") || s.equals("Are")).map(s -> s + " String").forEach(System.out::println);流(Java 8)对于一般的计算机程序 , 通常必须使用值列表 , 并对每个值执行给定的转换 。在Java 8之前 , 您必须使用for循环进行此转换 , 但是从现在开始 , 您可以按以下方式使用Streams:
Stream.of("hello", "great").map(s -> s + " world").forEach(System.out::println);> hello world> great worldmap函数将一个lambda作为输入 , 它将应用于流中的所有元素 。
流可以在列表 , 集合和地图上工作(通过转换) 。多亏了Streams , 您可以摆脱代码中几乎所有的循环!
 
可选项(Java 8)Java中的另一个常见问题是空指针异常 。因此 , Java引入了Optional —一个monad , 它包装了一个可能为null或不为null的引用 。可以通过功能性方式将更新应用于此Optional:
Optional.of(new Random().nextInt(10)).filter(i -> i % 2 == 0).map(i -> "number is even: " + i).ifPresent(System.out::println);> number is even: 6在上面的代码段中 , 我们创建一个随机数 , 将其包装在Optional对象中 , 然后仅打印偶数 。
JShell(Java 9)【十分钟从Java 8到Java 15】最后 , 我们有一个Java的REPL , 它的名字叫JShell!相反 , 您可以一次执行一个命令 , 然后立即看到结果 。这是一个简单的示例:
$ <JDK>/bin/jshelljshell> System.out.println("hello world")hello world长期以来 , 熟悉JavaScript或Python之类的解释语言的人们都对REPL感到满意 , 但到目前为止 , Java中缺少此功能 。JShell允许定义变量 , 但也可以定义更复杂的实体 , 例如多行函数 , 类和执行循环 。此外 , JShell支持自动完成功能 , 如果您不知道给定Java类提供的确切方法 , 该功能会派上用场 。
不可变集合的工厂方法(Java 9)很长时间以来 , Java中缺少对列表进行简单初始化的操作 , 但是现在已经过去了 。以前 , 您必须执行以下操作:
jshell> List<Integer> list = Arrays.asList(1, 2, 3, 4)list ==> [1, 2, 3, 4]现在将其简化如下:
jshell> List<Integer> list = List.of(1, 2, 3, 4)b ==> [1, 2, 3, 4]列表 , 集合和映射存在这种(…)方法 。它们都只用一行简单的代码就创建了一个不变的对象 。


推荐阅读