专注Java教育14年 全国咨询/投诉热线:444-1124-454
赢咖4LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 Java学习 6个重要的Java8新特性

6个重要的Java8新特性

更新时间:2022-05-10 11:29:54 来源:赢咖4 浏览970次

Java8新特性有哪些?赢咖4小编来告诉大家。

永久代

这实际上意味着什么?

谁从未配置过他们的“ PermSize ”或“ MaxPermSize ”JVM 内存?

这通常是在收到那些丑陋的“ java.lang.OutOfMemoryError: PermGen error ”错误后完成的。

这现在已被称为 Metaspace 的东西所取代。Metaspace 将根据我们在运行时对内存的需求重新调整大小。如果需要,我们仍然可以通过设置“ MaxMetaspaceSize ”参数来调整 Metaspace 的数量。

并行数组排序

我们习惯于使用“ Arrays.sort ”对数组进行排序。这使用了 Merge Sort 或 Tim Sort 进行排序算法。它们的问题是它们是按顺序执行的,因此我们无法获得多线程为我们提供的所有好处。为此,他们实现了“ Arrays.parallelSort ”。

那我们什么时候应该使用它呢?

我们不会立即获得使用我们的 2 核或更多核处理器的直接好处。

阵列应具有一定的大小,以查看性能方面的任何提升。一些比较表明,您将需要阵列中大约 200 万个元素才能开始看到改进。

查看这篇关于并行数组排序的帖子,了解有关基准测试和算法工作原理的更多详细信息。

Base64编码和解码

不久前,我不得不在一个项目中使用 Base64 编码和解码,才能传输 JSON 格式的文件。

我最终使用了第 3 方 API(apache Base64 库)来执行此操作。

此功能意味着我们不必四处寻找其他实现,使事情变得更容易一些。

一些基本的解码和编码示例

编码

String base64 = Base64.getEncoder().encodeToString("要编码的字符串".getBytes("utf-8"));

解码

byte[] asBytes = Base64.getDecoder().decode("你的 base 64 字符串");

日期和时间 API

在 Java 中处理日期和时间一直很痛苦。我们从 Date 类中现在最不推荐使用的方法开始,记住星期一是表示为 0 还是 1,添加 Calendar 类来处理 timeZones 等等……

这使我们使用 Joda Time 或其他一些 API 来简化事情。这将不再是必要的。

新的 API 与 Joda Time 非常相似,因此如果您已经熟悉它,您应该可以即时了解内容。如果您从未使用过 Joda Time,请不要担心,它使用起来非常简单。

一些日期和时间示例

javax.time.Clock

时钟.systemUTC(); //您系统的当前时间(UTC)。
Clock.millis();//从 1970 年 1 月 1 日开始的毫秒数。

javax.tme.ZoneId

ZoneId zone = ZoneId.of(“Europe/London”);//来自时区的zoneId。
Clock clock = Clock.system(zone);//设置一个时钟的区域。

javax.time.LocalDate

LocalDate date = LocalDate.now();//当前日期
String day = date.getDayOfMonth();//月份中的哪一天
String month = date.getMonthValue();//月份
String year = date.getYear();//年份

功能接口

函数式接口是精确定义一个抽象方法的接口。例如,我们有定义运行抽象方法的“ java.lang.Runnable ”:

公共抽象无效运行();

我们仍然可以添加任意数量的默认方法(非抽象)。

在定义新的功能接口时,我们必须定义新的注解“ @FunctionalInterface ”。这将允许我们阻止功能接口的错误使用,因为如果与新注释一起使用不当,它将无法编译。

Lambda 表达式

Lambda 表达式可能是 Java 8 最大和最受期待的特性。它们基本上用于将代码而不是对象传递给方法或处理一组数据以执行算法。

这将产生更简单、更易读的代码。让我们看一下围绕这个的一些概念。

内部或外部迭代

Java 中的常规方法是在外部迭代集合,所以我们会有这样的东西:

对于(字符串值:myCollection){
		System.out.println(值);
	}

我们在这里所做的是迭代列表并一一拉取对象。如果我们可以从一开始就说我们想从集合中提取什么,那会更自然。这正是我们如何使用 lambdas 的概念:

myCollection.forEach((String value) -> System.out.println(value));

传递行为

这对我来说是我们真正可以在 lambda 表达式中发现潜力的地方。我们可以将行为传递给函数,使基本功能更加通用,并大大提高项目的可用性。

例如,如果我们想创建一个打印 List 的所有元素的方法,我们将执行以下操作:

公共无效 printAllStrings (列表列表字符串){
		for(字符串字符串对象:listString){
			System.out.println(stringObject);
		}
	}

如果我们现在只想打印长度超过 4 个字符的字符串:

公共无效 printLongerThan4Strings (列表列表字符串){
		for(字符串字符串对象:listString){
			if(stringObject.length() > 4) {
				System.out.println(stringObject);
			}	
		}
	}

在 Java 8 中,我们可以使这个过程更通用并重用我们的更多代码。我们可以传递一个谓词来进行过滤。它看起来像这样:

公共无效 printAllStrings (列表列表字符串,谓词p) {
		for(字符串字符串对象:listString){
			如果(p.test(stringObject)){
				System.out.println(stringObject);
			}	
		}
	}

现在我们所要做的就是在调用中传递谓词:

printAllStrings(listString, s -> true);
printAllStrings(listString, s -> s.length() > 4);

清洁、快速且可重复使用。

以上就是关于“6个重要的Java8新特性”的介绍,大家如果想了解更多相关知识,不妨来关注一下赢咖4的Java8新特性,里面有更丰富的知识等着大家去学习, 希望对大家能够有所帮助。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>