您的位置:首页 > 编程语言 > Java开发

Java1.7/1.8新特性

2016-08-25 11:23 357 查看
9、JAVA1.8新特性:

详见:http://www.importnew.com/11908.html

1、支持lambda表达式:lambda表达式最常用的就是用来替代匿名内部类,

语言设计者投入了大量精力来思考如何使现有的函数友好地支持lambda。最终采取的方法是:增加函数式接口的概念。函数式接口就是一个具有一个方法的普通接口。像这样的接口,可以被隐式转换为lambda表达式。java.lang.Runnable与java.util.concurrent.Callable是函数式接口最典型的两个例子。在实际使用过程中,函数式接口是容易出错的:如有某个人在接口定义中增加了另一个方法,这时,这个接口就不再是函数式的了,并且编译过程也会失败。为了克服函数式接口的这种脆弱性并且能够明确声明接口作为函数式接口的意图,Java
8增加了一种特殊的注解@FunctionalInterface(Java 8中所有类库的已有接口都添加了@FunctionalInterface注解)

如下:

@FunctionalInterface

public interface Functional {

    void method();

}

2、Lambda表达式的懒加载:

表达式:

person -> pe
4000
rson.getAge();

可以替换成

Person::getAge(Person传入参数,person.getAge()返回参数)

这种[方法引用]或者说[双冒号运算]对应的参数类型是Function<T,R>
T表示传入类型,R表示返回类型。比如表达式person -> person.getAge();
传入参数是person,返回值是person.getAge(),那么方法引用Person::getAge就对应着Function<Person,Integer>类型。

 

3、接口的默认方法与静态方法

Java 8用默认方法与静态方法这两个新概念来扩展接口的声明

默认方法与抽象方法不同之处在于抽象方法必须要求实现,但是默认方法则没有这个要求。相反,每个接口都必须提供一个所谓的默认实现,这样所有的接口实现者将会默认继承它(如果有必要的话,可以覆盖这个默认实现)

 

3、重复注解annotation @
(有什么用?)

自从Java 5引入了注解机制,这一特性就变得非常流行并且广为使用。然而,使用注解的一个限制是相同的注解在同一位置只能声明一次,不能声明多次。Java 8打破了这条规则,引入了重复注解机制,这样相同的注解可以在同一地方声明多次,例如:

 @Filter( "filter1" )

 @Filter( "filter2" )

 public interface Filterable {        

    }

此接口声明了两次@Filter注解

 

4、 更好的类型推测机制

Java 8在类型推测方面有了很大的提高。在很多情况下,编译器可以推测出确定的参数类型,这样就能使代码更整洁。让我们看一个例子:

List<String> list = new ArrayList<String>();
之前的写法,前后都必须声明泛型

List<String> list = new ArrayList<>();  现在编译器可以自己推断出泛型声明

 

5、扩展注解的支持

Java 8扩展了注解的上下文。现在几乎可以为任何东西添加注解:局部变量、泛型类、父类与接口的实现,就连方法的异常也能添加注解

 

6、JAVA类库新特性:

Optional

到目前为止,臭名昭著的空指针异常是导致Java应用程序失败的最常见原因。以前,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代码。受到Google
Guava的启发,Optional类已经成为Java 8类库的一部分。

 

7、函数式编程StreamAPI

最新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中,Stream
API极大简化了集合框架的处理(但它的处理的范围不仅仅限于集合框架的处理)stream:一串支持连续、并行聚集操作的元素

如下:

final Collection< Task > tasks = Arrays.asList(

    new Task( Status.OPEN,
5 ),

    new Task( Status.OPEN,
13 ),

    new Task( Status.CLOSED,
8 )

);

我们下面要讨论的第一个问题是所有状态为OPEN的任务一共有多少分数?在Java 8以前,一般的解决方式用foreach循环,但是在Java
8里面我们可以使用stream:一串支持连续、并行聚集操作的元素。

 

// Calculate total points of all active tasks using sum()

final long totalPointsOfOpenTasks = tasks

    .stream()

    .filter( task -> task.getStatus() == Status.OPEN )

    .mapToInt( Task::getPoints )

    .sum();

         

System.out.println(
"Total points: " + totalPointsOfOpenTasks );

步骤讲解:

1、task集合被转换化为其相应的stream表示。

2、filter操作过滤掉状态为CLOSED的task。

3、mapToInt操作通过Task::getPoints这种方式调用每个task实例的getPoints方法把Task的stream转化为Integer的stream。

4、用sum函数把所有的分数加起来,得到最终的结果。

厉害了函数式编程和Stream相结合

 

8、
Date/Time API (JSR 310)

Java 8通过发布新的Date-Time API (JSR 310)来进一步加强对日期与时间的处理

第一个是Clock类,它通过指定一个时区,然后就可以获取到当前的时刻,日期与时间。Clock可以替换System.currentTimeMillis()与TimeZone.getDefault()。

我们需要关注的其他类是LocaleDate与LocalTime。LocaleDate只持有ISO-8601格式且无时区信息的日期部分。相应的,LocaleTime只持有ISO-8601格式且无时区信息的时间部分。LocaleDate与LocalTime都可以从Clock中得到

 

9、JavaScript引擎Nashorn

Nashorn,一个新的JavaScript引擎随着Java 8一起公诸于世,它允许在JVM上开发运行某些JavaScript应用。Nashorn就是javax.script.ScriptEngine的另一种实现,并且它们俩遵循相同的规则,允许Java与JavaScript相互调用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: