jdk下载链接
jdk是否收费
1.jdk7新特性
- 二进制字面量
jdk7开始,可以用二进制字面量表示整数(byte、short、int、long)。使用二进制字面量可以让代码简介更易理解,使用时需要在二进制前加0b或者0B,示例如下:
int a = 0b110110
- 字面量支持下划线
下划线不能出现在小数点旁、不能出现在数值开头和解围、不能出现在数值标示和进制之间,示例如下:
int a = 0b110_110
- swith语句支持字符串,示例如下:
switch(str)
case a:
break;
case b:
break;
- 泛型自动推断,示例如下:
List<String> list = new Arraylist<>();
- 异常多个catch合并,异常之间用|分割,示例如下:
try(){
} catch(IOExcepton | NullPointerException e) {
}
- try-with-resource语句支持
之前使用流时需要在finally里手动关闭释放资源,现在只要接口实现java.lang.AutoCloseable,系统会自动关闭资源,示例如下:
private static void method() {
FileReader fr = null;
FileWriter fw = null;
try {
fr = new FileReader("a.txt");
fw = new FileWriter("b.txt");
int ch = 0;
while ((ch = fr.read()) != -1) {
fw.write(ch);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fw != null) {
fw.close();
}
if (fw != null) {
fr.close();
}
}
try (FileReader fr = new FileReader("a.txt");
FileWriter fw = new FileWriter("b.txt");) {
int ch = 0;
while ((ch = fr.read()) != -1) {
fw.write(ch);
}
} catch (IOException e) {
e.printStackTrace();
}
}
2.jdk8新特性
- lambada表达式
lambada表达式也可成为闭包,允许将函数作为参数传递。lambada表达式组成:逗号分割的参数列表,-> ,函数体三部分表示,函数体比较复杂时可以将函数体放在{},示例如下:
new Thread( () -> System.out.println("In Java8, Lambda expression rocks !!") ).start();
- 日期API
java.util.Date是非线程安全的,时区处理比较麻烦,jdk8在java.time包下提供了很多新的API,以下是两个重要的API:
Local:简化了日期处理,没有时区问题
Zoned:通过制定的时区处理日期时间
示例如下:
LocalDate.now();
ZonedDateTime.now(Clock.systemUTC());
- 引入Optional,常用方法如下:
(1)Optional.of(T t): 创建一个Optional 实例
(2)Optional.empty(): 创建一个空的Optional 实例
(3)Optional.ofNullable(T t):若t不为null,创建 Optional 实例,否则创建空实例
(4)isPresent():判断是否包含值 orElse(T t): 如果调用对象包含值,返回该值,否则返回t
(5)orElseGet(Supplier s):如果调用对象包含值,返回该值,否则返回s获取的值
(6)map(Function f):如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty()
(7)flatMap(Function mapper):与 map 类似,要求返回值必须是Optional
- Stream流,可对集合进行复杂的查找、过滤、去重、排序等,示例如下:
Map<Integer, Integer> map = new HashMap<>();
map.put(10, 10);
map.put(31, 31);
map.put(53, 53);
map.put(86, 86);
map.put(20, 20);
List<Integer> list = map.keySet().stream().collect(Collectors.toList());
list = list.stream().filter(item -> item % 2 == 0).collect(Collectors.toList());
list = list.stream().sorted((a, b) -> b - a).collect(Collectors.toList());
list.stream().forEach(item -> {System.out.println(item);});
- 接口可以定义默认方法、静态方法
默认方法:传统方式接口中定义的方法都是抽象方法,实现接口的类都需要实现抽象方法,接口中如果需要新增方法,所有类都要实现,不符合OCP原则。jdk8引入了默认方法,使用default关键字定义,可以有具体方法实现,实现类不必做修改。如果多个接口都有默认方法,可以用super指定默认方法,也可以自己实现覆盖。示例如下:
public interface Test{
default void hello(){
System.out.println("我是接口默认方法,哈哈!");
}
}
静态方法:接口中可以实现静态方法,示例如下:
public interface Test {
public static void sysHello() {
System.out.println("你好啊,我是接口静态方法!");
}
}
- 函数式接口
如果一个接口只有一个抽象方法,该接口可以称之为函数式接口,函数式接口可以使用lambada表达式,lambada会被匹配到这个抽象方法上,@FunctionalInterface注解检测接口是否符合函数式接口,常见的函数式接口Predicate,Function<T,R>,示例如下:
public class Test03 {
public static void main(String[] args) {
Operater o=arr -> {
int sum=0;
for(int n:arr){
sum+=n;
}
System.out.println("数组的和为:"+sum);
};
fun(o);
}
public static void fun(Operater operater){
int[] arr={2,3,4,5,6,7,11};
operater.getSum(arr);
}
}
@FunctionalInterface
interface Operater{
public abstract void getSum(int[] arr);
}
- 方法引用
方法引用是lambada的一种简写形式。如果lambada表达式方法体中只是调用一个特定的已存在的方法,则可以使用方法引用。常见形式:
对象::实例方法
类::静态方法
类::实例方法
类::new