Java8新特性解析

Java 8中的新特性有:
接口中默认方法,lambda 表达式,方法引用,重复注解,流、函数、接口、map扩展、日期中的新变化等,接下来一一介绍

1. Default Methods for Interfaces(接口中的默认方法)

Java 8准许我们在接口中增加一个通过default关键字修饰的非抽象的方法. 这个特性被我们称为扩展方法. 下面举例说明:

interface Formula {
   
    double calculate(int a);

    default double sqrt(int a) {
   
        return Math.sqrt(a);
    }
}

接口Formula 中除了抽象方法calculate 其中还定义了非抽象方法sqrt. 实现类里面继承了抽象方法calculate. 而默认方法可以直接调用.

Formula formula = new Formula() {
   
    @Override
    public double calculate(int a) {
   
        return sqrt(a * 100);
    }
};

formula.calculate(100);     // 100.0
formula.sqrt(16);           // 4.0

formula是一个继承Formula 接口的匿名对象. 实例代码十分详细: 仅仅6行代码实现了一个简单的 sqrt(a * 100)计算. 在接下来的章节, 将给大家介绍更加完善的方案实现单个方法对象在Java8中的使用.

2. Lambda expressions(Lambda表达式)

通过下面实例向大家展示怎么在之前版本中对List中的String排序:

List<String> list = Arrays.asList("aa","peter","bob");
Collections.sort(list, new Comparator<String>() {
   

	@Override
	public int compare(String o1, String o2) {
   
		return o1.compareTo(o2);
	}
});

通过一个静态 Collections.sort 方法接收一个list和compare来对每个List中的元素排序.你经常发现你自己创建一个匿名Comparator类并通过它来实现排序.

为了摆脱通过创建匿名对象的方式来实现排序, Java 8带来了更加简洁的方式实现方式,lambda 表达式:

List<String> list = Arrays.asList("aa","peter","bob");
Collections.sort(list, (String a, String b)->{
   return a.compareTo(b);});

你会发现代码更加简洁可读性更强. 甚至它还可以更加简洁:

List<String> list = Arrays.asList("aa","peter","bob");
Collections.sort(list, (String a, String b)-> a.compareTo(b));

对于单行的方法体你可以直接省略{}和return关键字. 甚至可以使它更加简短:

List<String> list = Arrays.asList("aa","peter","bob");
Collections.sort(list, (a, b)-> a.compareTo(b));

Java编译器能够自动识别参数类型所以你能够省略它们. 让我们更深入的了解lambda 表达式在java中更广泛的应用.

3. Functional Interfaces(函数化接口)

lambda表达式怎么去匹配Java类型呢? 每一个lambda表达式相当于指定一个接口的类型. 一个必须定义一个抽象的方法的函数接口. 每一个lambda表达式类型都将和这个抽象方法匹配.由于默认方法并不是抽象方法,所以你可以自由的添加默认方法到你的函数接口中.

我们能够使用任意接口作为lambda表达式,这个接口中只需要包含一个抽象的方法就可以了. 为了确保你的接口满足需求,你需要在你接口上添加一个@FunctionalInterface注解.当你使用这个注解之后,这个接口只能定义一个抽象方法,否者编译器会报错 .

Example:

@FunctionalInterface
interface Convertor<F,T> {
   
	
	T convert(F from);
	
}

Convertor<String, Integer> convertor = (from) -> Integer.valueOf(from);
System.out.println(convertor.convert("123"));//123

注意@FunctionalInterface也是有效代码.

4. Method and Constructor References(方法和构造器的引用)

上面的代码可以通过静态方法应用可以更加简洁:

Convertor<String, Integer> convertor = Integer::valueOf;
System.out.println(convertor.convert("123"));//123

Java 8能够传递一个方法或者构造器引用通过 ::关键字. 上面的实例向你们展示了怎么去引用一个静态方法. 我们也能够引用一个普通对象方法:

@FunctionalInterface
interface Convertor<F,T> {
   
	
	T convert(F from);
	
}

public class Test {
   
	
	public static void main(String[] args) {
   
		Test test = new Test();
		Convertor<String, Integer> convertor = test::startWith;
		System.out.println(convertor.convert("123"));//1
	}
	
	private Integer startWith(String ori) {
   
		return Integer.valueOf(ori.substring(0, 1));
	}
}

让我们来看看::是怎么引用构造器的. 首先我们定义两个构造器在一个javabean中

class Person {
   
	private String firstName;
	
	private String lastName;
	
	public Person() {
   
	}
	public Person(String firstName, String last) {
   
		this.firstName = firstName;
		this.lastName = last;
	}
	@Override
	public String toString() {
   
		return "Person [firstName=" + firstName + ", lastName=" + lastName
				+ "]";
	}
	
}

下一步我们创建一个工厂接口,用它来创建一个Person对象:

interface PersonFactory<P extends Person> {
   
	P getInstance(String firstName, String last);
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值