JDK8较JDK7部分新特性

时间:2021-10-09 15:17:06

参考:浅谈JDK8相对于JDK7的一些新特性
本文所有代码在JDK1.8 中运行

特性一、接口的默认方法

在JDK8中,允许给接口本身添加一个默认的实现。用“default”进行修饰。

/**
* Created by user on 2017/9/4.
*/

public interface MyComputer {
default int sum(int a,int b){
return a+b;
}
int subtraction(int a,int b);
}

public class test2170814 implements MyComputer{
public int subtraction(int a, int b) {
return a-b;
}
public static void main(String[] args){
MyComputer a = new test2170814() ;
System.out.println(a.sum(1,3));
System.out.println(a.subtraction(3,2));

}
}

运行结果:
4
1

特性二、静态方法与构造函数的引用

  1. 静态方法引用

用来存储这个引用的类型用@FunctionlaInterface注解来标识。

//@param <F> 传值类型
//@param <T> 结果类型
public class test1 {
public static void main(String[] args){
Fun<String,String> fun = test1::testMethod;
System.out.println(fun.run("This is a test"));
}
@FunctionalInterface
interface Fun<F,T>{
T run(F from);
}
public static String testMethod(String args){
return args;
}

}

运行结果:
This is a test
test1::testMethod 表示test1类中的testMethod方法

  1. 构造函数的引用
public class test1 {
public static void main(String[] args){
Fun2<test1> mainFun = test1::new;
mainFun.run("Creating");
}
@FunctionalInterface
interface Fun2<F extends test1>{
F run(String args);
}
public test1(String arg){
System.out.println(arg);
}

}

运行结果:
Creating

特性三、Lambda表达式

在JDK8中,引入了Lambda

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class test1 {
public static void main(String[] args){
List<String> list = Arrays.asList("asd","dweas","aw","trs");
Collections.sort(list,(str1,str2)-> str1.compareTo(str2));
for(String i :list){
System.out.println(i);
}
}

}

运行结果:
asd
aw
dweas
trs

上述为升序
再来看看降序:

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class test1 {
public static void main(String[] args){
List<String> list = Arrays.asList("asd","dweas","aw","trs");
Collections.sort(list,(str1,str2)-> str2.compareTo(str1));
for(String i :list){
System.out.println(i);
}
}

}

运行结果:
trs
dweas
aw
asd

核心代码:Collections.sort(list,(str1,str2)-> str2.compareTo(str1));

特性四、反射加强

它允许你直接通过反射获取参数的名字

import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

public class ParameterNames {
public static void main(String[] args) throws Exception {
Method method = ParameterNames.class.getMethod( "main", String[].class );
for( final Parameter parameter: method.getParameters() ) {
System.out.println( "Parameter: " + parameter.getName() );
}
}
}

如果不使用–parameters参数来编译这个类,然后运行这个类,会得到下面的输出:

Parameter: arg0

如果使用–parameters参数来编译这个类,程序的结构会有所不同(参数的真实名字将会显示出来):

Parameter: args

此外,Parameter类有一个很方便的方法isNamePresent()来验证是否可以获取参数的名字。

特性五、JVM新特性

PermGen空间被移除了,取而代之的是Metaspace(JEP
122)。JVM选项-XX:PermSize与-XX:MaxPermSize分别被-XX:MetaSpaceSize与-XX:MaxMetaspaceSize所代替。