Chinaunix首页 | 论坛 | 博客
  • 博客访问: 471253
  • 博文数量: 153
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1575
  • 用 户 组: 普通用户
  • 注册时间: 2016-12-20 17:02
文章分类

全部博文(153)

文章存档

2017年(111)

2016年(42)

我的朋友

分类: Java

2017-01-09 15:40:11

引言

目前由于系统已经全面切换为JDK8,所以有必要系统的了解一下Java8的一些新特性,以便后续在日常工作中可以使用一些高级特性来提高编程效率。

因为Java8引入了函数式接口,在java.util.function包含了几大类函数式接口声明。这里第一篇主要研究一下Function相关的接口。

FunctionalInterface注解

Java8的新引入,包含函数式的设计,接口都有@FunctionalInterface的注解。就像这个注解的注释说明一样,它注解在接口层面,且注解的接口要有且仅有一个抽象方法。具体就是说,注解在Inteface上,且interface里只能有一个抽象方法,可以有default方法。因为从语义上来讲,一个函数式接口需要通过一个***逻辑上的***方法表达一个单一函数。那理解这个单一就很重要了,单一不是说限制你一个interface里只有一个抽象方法,单是多个方法的其他方法需要是继承自Object的public方法,或者你要想绕过,就自己实现default。函数式接口自己本身一定是只有一个抽象方法。同时,如果是Object类的public方法,也是不允许的。官方的说明翻译如下:

如果一个接口I,I有一组抽象方法集合M,且这些方法都不是Object类的public签名方法,那么如果存在一个M中的方法m,满足:

  • m的签名是所有M中方法签名的子签名。
  • m对于M中的每个方法都是返回类型可替换的。 此时,接口I是一个函数式接口。

怎么理解,看几个例子。

比如:你声明一个接口:

@FunctionalInterface public interface Func { } 

这会编译错,编译器会告诉你*no target method*。而如果加一个方法:

@FunctionalInterface public interface Func { void run();
} 

这就OK了,一个函数式接口声明好了。再加一个呢?

@FunctionalInterface public interface Func { void run(); void foo();
} 

不ok,明确说了只有一个抽象方法嘛。但是如果换一种函数签名:

@FunctionalInterface public interface Func { boolean equals(Object obj);
} 

错误依旧,因为这个方法签名是Object类的public方法。而再改一下:

@FunctionalInterface public interface Func { boolean equals(Object obj); void run();
} 

这就OK了。一个抽象方法,一个Object的public方法,相安无事。Object还有其他方法,clone方法试试会怎么样?

@FunctionalInterface public interface Func { Object clone(); void run();
} 

这又不行了,因为前面明确说了,要是Object的public方法,而clone是protected的。


阅读全文请点击:
阅读(1567) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~