当前位置: 首页 > 后端技术 > Java

Java8新特性和代码示例

时间:2023-04-01 13:47:36 Java

Java8于2014年初发布。本文列出了Java8的重要特性,并提供了lambda表达式、Java流、函数式接口、接口默认方法和日期时间API更改等特性的代码示例。1.Lambda表达式使用Scala的同学对Lambda表达式已经很熟悉了。在Java编程语言中,lambda表达式只是一个匿名函数,即没有名称和任何修饰符的函数。1.1lambda语法lambda表达式的基本语法://如果lambda表达式的字面量只有一条语句,花括号可以省略//匿名函数的返回类型与字面量表达式相同。(parameters)->expression//当字面量中有多个语句时,这些语句必须用大括号括起来。(参数)->{语句;}//空括号用于表示一组空参数()->表达式例如://这个lambda表达式接收两个参数并返回它们的和(x,y)->x+y可以用上面的例子比如两个整数相加,也可以用来连接两个字符串,Java会根据上下文自动进行类型匹配。1.2Lambda编写规则一个lambda表达式可以有零个、一个或多个参数。参数的类型可以显式声明或从上下文推断。多个参数括在括号中并用逗号分隔。空括号用于表示一组空参数。当只有一个参数时,如果推断其类型,则不需要括号。lambda表达式的主体可以包含零个、一个或多个语句。如果lambda表达式的字面量只有一条语句,花括号可以省略,匿名函数的返回类型与字面量表达式相同。当文字中有多个语句时,这些语句必须用大括号括起来。2.函数式接口函数式接口是只有一个抽象方法的接口,接口只允许有一个抽象方法。Java8引入了一个新的注解@FunctionalInterface,我们可以用它来给出编译时错误以及检查功能接口是否违反规范。2.1Example//注解是可选的,也可以不写注解@FunctionalInterfacepublicinterfaceMyFirstFunctionalInterface{publicvoidonlyOneMethod();}即使省略了注解@FunctionalInterface,函数式接口仍然有效。它仅用于通知编译器在接口中强制执行单个抽象方法。另外,由于默认方法不是抽象方法,有默认实现,所以符合函数式接口的定义。另一个要记住的关键点是,如果一个功能接口覆盖了基类的公共方法之一(java。将有来自(java.lang.Object)或其他地方的实现。下面给出了一个完全有效的功能接口:@FunctionalInterfacepublicinterfaceMyFirstFunctionalInterface{publicvoidonlyOneMethod();@OverridepublicStringtoString();@Overridepublicbooleanequals(Objectobj);}3.默认方法Java8允许我们向接口添加非抽象方法。这些方法必须声明作为默认方法。在Java8中引入了默认方法,以更好地利用lambda表达式的强大功能。默认方法允许我们向库的接口引入新功能,并确保与为这些接口的旧版本编写的代码的二进制兼容性。让我们通过一个例子:publicinterfaceMoveable{defaultvoidmove(){System.out.println("Iammoving");}}Moveable接口定义了一个move()方法并提供了一个默认实现。任何类如果实现了这个接口,就不需要实现自己的move()方法,直接调用实例后面的move()方法即可。例如:publicclassAnimalimplementsMoveable{publicstaticvoidmain(String[]args){Animaltiger=newAnimal();老虎移动();}}//print:Iammoving如果类愿意自定义move()方法,那么它可以提供自己的自定义实现并覆盖move()方法。4.JavaStreamsJava8的另一个主要变化是引入了流,它提供了一种以各种方式操作数据的机制,包括过滤、转换或任何其他可能对应用程序有用的方式。Java8中的StreamsAPI支持不同类型的迭代,我们定义要处理的项目集、对每个项目执行的操作以及存储这些操作的输出的位置。4.1示例下面的例子,我们要删除str前缀的数据:packagecn.dayangshuo;importjava.util.Arrays;importjava.util.List;importjava.util.stream.Collectors;/***@作者DAYANG*/publicclassStreamTest{publicstaticvoidmain(String[]args){Listitems=Arrays.asList("str123","dayang","Dayang");字符串前缀="str";ListfilteredList=items.stream().filter(e->(!e.startsWith(prefix))).collect(Collectors.toList());filteredList.forEach(System.out::println);}}//打印内容://dayang//Dayang5.Java8time/dateAPIchangesThenewdateandtimeAPI/class(JSR-310),alsoknownasThreeTen,justchangeswhatwedoinjavaapplicationsHowto处理日期。5.1日期类/时区类Data类已过时。用于替换Date类的新类是LocalDate、LocalTime和LocalDateTimeLocalDate:表示日期,不带时间或时区信息LocalTime:表示时间,不带日期或时区信息LocalDateTime表示日期和时间,不带时区信息如果我们希望Date功能与时区信息一起使用,那么Lambda为我们提供了三个与上述类似的附加类,即OffsetDate、OffsetTime和OffsetDateTime。例子://此时的日期LocalDatelocalDate=LocalDate.now();//时间LocalTimelocalTime=LocalTime.of(12,20);//此时的日期和时间LocalDateTimelocalDateTime=LocalDateTime.now();//2017-03-13T11:28:29.247+08:00:EastZone8TimeOffsetDateTimeoffsetDateTime=OffsetDateTime.now();//2017-03-13T04:28:29.248+01:00[欧洲/巴黎]:欧洲巴黎时间ZonedDateTimezonedDateTime=ZonedDateTime.now(ZoneId.of("Europe/Paris"));5.2Timestamp和Duration类为了表示任意时刻的特定时间戳,需要用到的类是Instant。此类表示具有纳秒级精度的瞬间。示例:将Instant与另一个Instant进行比较并增加或减少一些时间的操作//2017-03-13T03:38:57.134ZInstantinstant=Instant.now();//2017-03-13T03:38:57.134ZInstantinstant1=instant.plus(Duration.ofMillis(5000));//2017-03-13T03:38:47.134ZInstantinstant2=instant.minus(Duration.ofMillis(5000));//2017-03-13T03:38:42.134ZInstantinstant3=instant.minusSeconds(10);Duration类(duration)是Java8中最早出现的一个新概念。它表示两个时间戳之间的时间差。Duration处理小的时间单位,例如毫秒、秒、分钟和小时。它们更适合与应用程序代码交互。持续时间duration=Duration.ofMillis(5000);duration=Duration.ofSeconds(60);duration=Duration.ofMinutes(10);要处理更大的时间间隔,您可以使用Period类Periodperiod=Period.ofDays(6);period=Period.ofMonths(6);period=Period.between(LocalDate.now(),LocalDate.now().plusDays(60));

最新推荐
猜你喜欢