java8特性什么时候发布的 JAVA 8 什么时候出
大家好,今天来为大家分享java8特性什么时候发布的的一些知识点,和JAVA 8 什么时候出的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!
Java8的特性有哪些
1、函数式接口
Java 8引入的一个核心概念是函数式接口(Functional Interfaces)。通过在接口里面添加一个抽象方法,这些方法可以直接从接口中运行。如果一个接口定义个唯一一个抽象方法,那么这个接口就成为函数式接口。同时,引入了一个新的注解:@FunctionalInterface。可以把他它放在一个接口前,表示这个接口是一个函数式接口。这个注解是非必须的,只要接口只包含一个方法的接口,虚拟机会自动判断,不过最好在接口上使用注解@FunctionalInterface进行声明。在接口中添加了@FunctionalInterface的接口,只允许有一个抽象方法,否则编译器也会报错。
java.lang.Runnable就是一个函数式接口。
@FunctionalInterface
public interface Runnable{
public abstract void run();
}
2、Lambda表达式
函数式接口的重要属性是:我们能够使用 Lambda实例化它们,Lambda表达式让你能够将函数作为方法参数,或者将代码作为数据对待。Lambda表达式的引入给开发者带来了不少优点:在 Java 8之前,匿名内部类,监听器和事件处理器的使用都显得很冗长,代码可读性很差,Lambda表达式的应用则使代码变得更加紧凑,可读性增强;Lambda表达式使并行操作大集合变得很方便,可以充分发挥多核 CPU的优势,更易于为多核处理器编写代码;
Lambda表达式由三个部分组成:第一部分为一个括号内用逗号分隔的形式参数,参数是函数式接口里面方法的参数;第二部分为一个箭头符号:->;第三部分为方法体,可以是表达式和代码块。语法如下:
1.方法体为表达式,该表达式的值作为返回值返回。
(parameters)-> expression
2.方法体为代码块,必须用{}来包裹起来,且需要一个 return返回值,但若函数式接口里面方法返回值是 void,则无需返回值。
(parameters)->{ statements;}
例如,下面是使用匿名内部类和 Lambda表达式的代码比较。
下面是用匿名内部类的代码:
button.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
System.out.print("Helllo Lambda in actionPerformed");
}
});
下面是使用 Lambda表达式后:
button.addActionListener(
\\actionPerformed有一个参数 e传入,所以用(ActionEvent e)
(ActionEvent e)->
System.out.print("Helllo Lambda in actionPerformed")
);
上面是方法体包含了参数传入(ActionEvent e),如果没有参数则只需(),例如 Thread中的 run方法就没有参数传入,当它使用 Lambda表达式后:
Thread t= new Thread(
\\run没有参数传入,所以用(),后面用{}包起方法体
()->{
System.out.println("Hello from a thread in run");
}
);
通过上面两个代码的比较可以发现使用 Lambda表达式可以简化代码,并提高代码的可读性。
为了进一步简化 Lambda表达式,可以使用方法引用。例如,下面三种分别是使用内部类,使用 Lambda表示式和使用方法引用方式的比较:
//1.使用内部类
Function<Integer, String> f= new Function<Integer,String>(){
@Override
public String apply(Integer t){
return null;
}
};
//2.使用 Lambda表达式
Function<Integer, String> f2=(t)->String.valueOf(t);
//3.使用方法引用的方式
Function<Integer, String> f1= String::valueOf;
要使用 Lambda表达式,需要定义一个函数式接口,这样往往会让程序充斥着过量的仅为 Lambda表达式服务的函数式接口。为了减少这样过量的函数式接口,Java 8在 java.util.function中增加了不少新的函数式通用接口。例如:
Function<T, R>:将 T作为输入,返回 R作为输出,他还包含了和其他函数组合的默认方法。
Predicate<T>:将 T作为输入,返回一个布尔值作为输出,该接口包含多种默认方法来将 Predicate组合成其他复杂的逻辑(与、或、非)。
Consumer<T>:将 T作为输入,不返回任何内容,表示在单个参数上的操作。
例如,People类中有一个方法 getMaleList需要获取男性的列表,这里需要定义一个函数式接口 PersonInterface:
interface PersonInterface{
public boolean test(Person person);
}
public class People{
private List<Person> persons= new ArrayList<Person>();
public List<Person> getMaleList(PersonInterface filter){
List<Person> res= new ArrayList<Person>();
persons.forEach(
(Person person)->
{
if(filter.test(person)){//调用 PersonInterface的方法
res.add(person);
}
}
);
return res;
}
}
为了去除 PersonInterface这个函数式接口,可以用通用函数式接口 Predicate替代如下:
class People{
private List<Person> persons= new ArrayList<Person>();
public List<Person> getMaleList(Predicate<Person> predicate){
List<Person> res= new ArrayList<Person>();
persons.forEach(
person->{
if(predicate.test(person)){//调用 Predicate的抽象方法 test
res.add(person);
}
});
return res;
}
}
3、接口的增强
Java 8对接口做了进一步的增强。在接口中可以添加使用 default关键字修饰的非抽象方法。还可以在接口中定义静态方法。如今,接口看上去与抽象类的功能越来越类似了。
默认方法
Java 8还允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法。在实现该接口时,该默认扩展方法在子类上可以直接使用,它的使用方式类似于抽象类中非抽象成员方法。但扩展方法不能够重载 Object中的方法。例如:toString、equals、 hashCode不能在接口中被重载。
例如,下面接口中定义了一个默认方法 count(),该方法可以在子类中直接使用。
public interface DefaultFunInterface{
//定义默认方法 countdefault int count(){
return 1;
}
}
public class SubDefaultFunClass implements DefaultFunInterface{
public static void main(String[] args){
//实例化一个子类对象,改子类对象可以直接调用父接口中的默认方法 count
SubDefaultFunClass sub= new SubDefaultFunClass();
sub.count();
}
}
静态方法
在接口中,还允许定义静态的方法。接口中的静态方法可以直接用接口来调用。
例如,下面接口中定义了一个静态方法 find,该方法可以直接用 StaticFunInterface.find()来调用。
public interface StaticFunInterface{public static int find(){
return 1;
}
}
public class TestStaticFun{
public static void main(String[] args){
//接口中定义了静态方法 find直接被调用
StaticFunInterface.fine();
}
}
JAVA 8 什么时候出
JDK8是Oracle在今年3月(2014年3月19日)发布正式版的,和JDK7(2011年7月发布)相隔了近3年(拖的时间堪比JDK7和JDK6之间的时间,与历史版本发布间隔相比排在第二位,JDK6发布是2006,JDK7与之相比之间差了5年,这两个版本发布时间间隔最长,中间发生了Oracle收购SUN的大事件,JDK6因此曾成为使用率最高的JDK,),中间因意见不统一多次延迟。
JDK8改进比较多,最大的改进是Lambda表达式(以及因之带来的函数式接口,很多原有类都做了变更,但能够与以往版本兼容,堪称奇功!),还有Stream API流式处理,joda-time等等一些新特性。
但有一些本来计划发布的大变更,比如模块化等推迟到了JDK9中。
JDK8发布估计是和JDK1.4~JDK1.5一样的大变更。
下面这个文库的ppt你可以先看看:
http://wenku.baidu.com/view/dc418232ddccda38376bafb0.html
java8官方支持到期时间
2020年12月。
Java8又称为jdk1.8,是Java语言开发的一个主要版本。Oracle公司于2014年3月18日发布Java8版本,它支持函数式编程,新的JavaScript引擎,新的日期API等。
Java8新增了非常多的特性,我们主要讨论以下几个:Lambda表达式_Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中。
方法引用_方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
默认方法_默认方法就是一个在接口里面有了一个实现的方法。
新工具_新的编译工具,如:Nashorn引擎jjs、类依赖分析器jdeps。
StreamAPI_新添加的StreamAPI(java.util.stream)把真正的函数式编程风格引入到Java中。
DateTimeAPI_加强对日期与时间的处理。
Optional类_Optional类已经成为Java8类库的一部分,用来解决空指针异常。
Nashorn,JavaScript引擎_Java8提供了一个新的Nashornjavascript引擎,它允许我们在JVM上运行特定的javascript应用。
OK,本文到此结束,希望对大家有所帮助。