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){List
