Java8新特性(十大)
Java8新特性包含语言、编译器、库、工具和JVM等方面的十多个新特性。
1.新特性
1.1.Java语言的新特性
1.1.1.Lambda表达式和函数式接口
1.1.2.接口的默认方法和静态方法
1.1.3.方法引用
1.1.4.重复注解
1.2.Java编译器的新特性
1.2.1.参数名称
1.3.Java官方库的新特性
1.3.1.Optional
https://blog.csdn.net/canot/article/details/52956230
1.3.2.Streams(代替for循环)
1.3.3.Date/Time API
1.3.4.JavaScript引擎Nashorn
1.3.5.Base64
1.3.6.并行数组
1.3.7.并发性
1.4.新的Java工具
1.4.1.Nashorn引擎:jjs
1.4.2.类依赖分析器:jdeps
参考资料:
https://blog.csdn.net/u014470581/article/details/54944384
https://www.cnblogs.com/yw0219/p/7302597.html
https://www.cnblogs.com/pkufork/p/java_8.html
2.Lambda表达式
2.1.Lambda表达式语法结构
2.1.1.标准语法结构
(Type1 param1, Type2 param2, …, TypeN paramN) -> {
statment1;
statment2;
//………….
return statmentM;
}
2.1.2.单参数语法结构
当lambda表达式的参数个数只有一个,可以省略小括号
2.1.3.单语句写法
当lambda表达式只包含一条语句时,可以省略大括号、return和语句结尾的分号
2.1.4.方法引用写法
Class or instance :: method
2.2.lambda表达式的本质
Lambda表达式本质上是一个匿名方法。
例如:
public int add(int x, int y) {
return x + y;
}
转成Lambda表达式后是这个样子:
(int x, int y) -> x + y;
参数类型也可以省略,Java编译器会根据上下文推断出来:
(x, y) -> x + y; //返回两数之和
或者
(x, y) -> { return x + y; } //显式指明返回值
可见Lambda表达式有三部分组成:参数列表,箭头(->),以及一个表达式或语句块。
将函数当成参数传递给某个方法
3.函数式接口
函数式接口就是只显式声明一个抽象方法的接口。为保证方法数量不多不少,java8提供了一个专用注解@FunctionalInterface,这样,当接口中声明的抽象方法多于或少于一个时就会报错。如下图所示:
4.接口的默认方法与静态方法
4.1.接口的默认方法
可以在接口中定义默认方法,使用default关键字,并提供默认的实现。所有实现这个接口的类都会接受默认方法的实现,除非子类提供的自己的实现。
4.2.接口的静态方法
可以在接口中定义静态方法,使用static关键字,也可以提供实现。
举例:
接口定义
package java8;
public interface InterfaceFunctional {
// static修饰符定义静态方法
static void staticMethod() {
System.out.println("InterfaceFunctional接口中的静态方法");
}
// default修饰符定义默认方法
default void defaultMethod() {
System.out.println("InterfaceFunctional接口中的默认方法");
}
}
实现类
package java8;
public class InterfaceFunctionalImpl implements InterfaceFunctional {
}
测试类:
package java8;
public class Test {
public static void main(String[] args) {
InterfaceFunctionalImpl impl = new InterfaceFunctionalImpl();
impl.defaultMethod();
InterfaceFunctional.staticMethod();
}
}
输出结果:
InterfaceFunctional接口中的默认方法
InterfaceFunctional接口中的静态方法
5.方法引用
举例:
package java8;
import java.util.function.Supplier;
public class FunctionalReference {
public static FunctionalReference create(final Supplier supplier) {
return supplier.get();
}
public static void collide(final FunctionalReference reference) {
System.out.println("Collided " + reference.toString());
}
public void follow(final FunctionalReference another) {
System.out.println("Following the " + another.toString());
}
public void repair() {
System.out.println("Repaired " + this.toString());
}
}
方法引用举例:
package java8;
import java.util.Arrays;
import java.util.List;
public class FunctionalReferenceTest {
public static void main(String[] args) {
// 第一种方法引用的类型是构造器引用,语法是Class::new,或者更一般的形式:Class::new。注意:这个构造器没有参数。
final FunctionalReference reference = FunctionalReference.create( FunctionalReference::new );
final List< FunctionalReference > references = Arrays.asList( reference );
// 第二种方法引用的类型是静态方法引用,语法是Class::static_method。注意:这个方法接受一个FunctionalReference类型的参数。
references.forEach( FunctionalReference::collide );
// 第三种方法引用的类型是某个类的成员方法的引用,语法是Class::method,注意,这个方法没有定义入参:
references.forEach( FunctionalReference::repair );
// 第四种方法引用的类型是某个实例对象的成员方法的引用,语法是instance::method。注意:这个方法接受一个Car类型的参数:
final FunctionalReference reference2 = FunctionalReference.create( FunctionalReference::new );
references.forEach( reference2::follow );
}
}
6.Streams
是一种迭代器
https://blog.csdn.net/u010425776/article/details/52344425
6.1.流的获取
// 集合
List list = new ArrayList();
Stream stream = list.stream();
// 数组
String[] names = {"chaimm","peter","john"};
Stream stream2 = Arrays.stream(names);
// 值
Stream stream3 = Stream.of("chaimm","peter","john");
// 文件
try {
Stream lines = Files.lines(Paths.get("文件路径名"),Charset.defaultCharset());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
6.2.使用:
List list1 = Arrays.asList(1,2,3,4);
Stream stream4 = list1.stream();
stream4.map(i -> i+1).forEach(System.out::println);
List alpha = Arrays.asList("a", "b", "c", "d");
//Before Java8
List alphaUpper = new ArrayList<>();
for (String s : alpha) {
alphaUpper.add(s.toUpperCase());
}
System.out.println(alpha); //[a, b, c, d]
System.out.println(alphaUpper); //[A, B, C, D]
// Java 8
List collect = alpha.stream().map(String::toUpperCase).collect(Collectors.toList());
System.out.println(collect); //[A, B, C, D]
// Extra, streams apply to any data type.
List num = Arrays.asList(1,2,3,4,5);
List collect1 = num.stream().map(n -> n * 2).collect(Collectors.toList());
System.out.println(collect1); //[2, 4, 6, 8, 10]