史上最全jdk新特性总结,涵盖jdk8到jdk15(1)

本文详细介绍了Java中的各种编程技术,包括方法引用、静态和构造器调用、StreamAPI的使用、Optional的处理、接口设计、JDK9至JDK14的新特性(如集合工厂方法、文本块、Records等),以及Java开发的学习资源。
摘要由CSDN通过智能技术生成
  1. 方法引用
  • 静态引用: 格式:Class::static_method

List list = Arrays.asList(“a”,“b”,“c”);

list.forEach(str -> System.out.print(str));

list.forEach(System.out::print)

  • 构造器调用 构造器方法引用格式:Class::new,调用默认构造器

List list = Arrays.asList(“a”,“b”,“c”);

List list.stream().map(Test::new).collect(Collectors.toList());

public class Test{

private final String desc;

public Test(String desc){

this.desc=desc;

}

}

  • 方法调用 格式:instance::method

List list = Arrays.asList(“a”,“b”,“c”);

Test test = new Test();

List list.stream().map(test::toAdd).collect(Collectors.toList());

public class Test{

private final String desc;

public Test(String desc){

this.desc=desc;

}

public String toAdd(String desc){

return desc+“add”;

}

}

  1. Stream API

// 使用jdk1.8中的Stream API进行集合的操作

@Test

public void test(){

// 循环过滤元素

proList.stream()

.fliter(§ -> “红色”.equals(p.getColor()))

.forEach(System.out::println);

// map处理元素然后再循环遍历

proList.stream()

.map(Product::getName)

.forEach(System.out::println);

// map处理元素转换成一个List

proList.stream()

.map(Product::getName)

.collect(Collectors.toList());

}

  1. 接口中的默认方法和静态方法

public interface ProtocolAdaptor {

ProtocolAdaptor INSTANCE = DynamicLoader.findFirst(ProtocolAdaptor.class).orElse(null);

default ProtocolAdaptor proxy() {

return (ProtocolAdaptor) Proxy.newProxyInstance(ProtocolAdaptor.class.getClassLoader(),

new Class[]{ProtocolAdaptor.class},

(proxy, method, args) -> intercept(method, args));

}

}

  1. Optional

用于处理对象空指针异常:

public String getDesc(Test test){

return Optional.ofNullable(test)

.map(Test::getDesc).else(“”);

}

JDK9

====

  • 收集工厂方法

借助Java 9的一项新功能,即集合工厂方法,您可以轻松地使用预定义的数据创建不可变的集合。您只需要在特定集合类型上使用of方法。

List fruits = List.of(“apple”, “banana”, “orange”);

Map<Integer, String> numbers = Map.of(1, “one”, 2,“two”, 3, “three”);

在Java 9之前,您可以使用Collections,但这绝对是一种更复杂的方法。

public List fruits() {

List fruitsTmp = new ArrayList<>();

fruitsTmp.add(“apple”);

fruitsTmp.add(“banana”);

fruitsTmp.add(“orange”);

return Collections.unmodifiableList(fruitsTmp);

}

public Map<Integer, String> numbers() {

Map<Integer, String> numbersTmp = new HashMap<>();

numbersTmp.put(1, “one”);

numbersTmp.put(2, “two”);

numbersTmp.put(3, “three”);

return Collections.unmodifiableMap(numbersTmp);

}

同样,仅从ArrayList对象表创建即可使用Arrays.asList(…)method。

public List fruitsFromArray() {

String[] fruitsArray = {“apple”, “banana”, “orange”};

return Arrays.asList(fruitsArray);

  • 接口中的私有方法

从Java 8开始,您可以在接口内部使用公共默认方法。但是仅从Java 9开始,由于接口中的私有方法,您将能够充分利用此功能。

ublic interface ExampleInterface {

private void printMsg(String methodName) {

System.out.println(“Calling interface”);

System.out.println("Interface method: " + methodName);

}

default void method1() {

printMsg(“method1”);

}

default void method2() {

printMsg(“method2”);

}

}

JDK10

=====

从Java 9和Java 10开始,有几种用于Optional的有用方法。其中最有趣的两个是orElseThrow和ifPresentOrElse。如果没有值,则使用该orElseThrow方法抛出NoSuchElementException。否则,它返回一个值。

public Person getPersonById(Long id) {

Optional personOpt = repository.findById(id);

return personOpt.orElseThrow();

}

因此,您可以避免将带参数的if语句与isPresentmethod一起使用。

public Person getPersonByIdOldWay(Long id) {

Optional personOpt = repository.findById(id);

if (personOpt.isPresent())

return personOpt.get();

else

throw new NoSuchElementException();

}

第二种有趣的方法是ifPresentOrElse。如果存在一个值,它将使用该值执行给定的操作。否则,它将执行给定的基于空的操作。

public void printPersonById(Long id) {

Optional personOpt = repository.findById(id);

personOpt.ifPresentOrElse(

System.out::println,

() -> System.out.println(“Person not found”)

);

}

在Java 8中,我们可以if-else直接与isPresent方法一起使用。

public void printPersonByIdOldWay(Long id) {

Optional personOpt = repository.findById(id);

if (personOpt.isPresent())

System.out.println(personOpt.get());

else

System.out.println(“Person not found”);

}

JDK 10 && JDK 11

================

从Java 10开始,您可以声明没有其类型的局部变量。您只需要定义var关键字而不是类型。从Java 11开始,您还可以将其与lambda表达式一起使用,如下所示。

public String sumOfString() {

BiFunction<String, String, String> func = (var x, var y) -> x + y;

return func.apply(“abc”, “efg”);

}

JDK 12

======

使用Switch表达式,您可以定义多个case标签并使用箭头返回值。此功能自JDK 12起可用。它使Switch表达式真正更易于访问。

public String newMultiSwitch(int day) {

return switch (day) {

case 1, 2, 3, 4, 5 -> “workday”;

case 6, 7 -> “weekend”;

default -> “invalid”;

};

}

对于低于12的Java,相同的示例要复杂得多。

public String oldMultiSwitch(int day) {

switch (day) {

case 1:

case 2:

case 3:

case 4:

case 5:

return “workday”;

case 6:

case 7:

return “weekend”;

default:

return “invalid”;

}

}

JDK 13

======

文本块是多行字符串文字,它避免使用转义序列,并以可预测的方式自动设置字符串格式。它还使开发人员可以控制字符串的格式。从Java 13开始,文本块可用作预览功能。它们以三个双引号(“”")开头。让我们看看我们如何轻松地创建和格式化JSON消息。

public String getNewPrettyPrintJson() {

return “”"

{

“firstName”: “Piotr”,

“lastName”: “Mińkowski”

}

“”";

}

创建Java 13之前的相同JSON字符串要复杂得多。

public String getOldPrettyPrintJson() {

return “{\n” +

"     “firstName”: “Piotr”,\n" +

"     “lastName”: “Mińkowski”\n" +

“}”;

}

JDK14

=====

使用Records,您可以定义不可变的纯数据类(仅限getter)。它会自动创建toString,equals和hashCode方法。实际上,您只需要定义如下所示的字段即可。

public record Person(String name, int age) {}

具有类似功能的类如record包含字段,构造函数,getter和实施toString,equals以及hashCode方法。

public class PersonOld {

private final String name;

private final int age;

public PersonOld(String name, int age) {

this.name = name;

this.age = age;

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

金三银四到了,送上一个小福利!

image.png

image.png

专题+大厂.jpg
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

[外链图片转存中…(img-exVPmIBX-1713581628575)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

金三银四到了,送上一个小福利!

[外链图片转存中…(img-c76Aa4uQ-1713581628575)]

[外链图片转存中…(img-lR8VuxhT-1713581628575)]

[外链图片转存中…(img-AZiN3ijh-1713581628576)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 30
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值