Java8新特性_加强版
Java8(又称jdk1.8)是Java语言开发的一个主要版本(即大版本)【对于新特性需使用API文档时,用1.8版本,否则查看不到】
函数式编程:简单理解就是把方法作为一个实参进行传递
函数式接口:一个接口中只有一个抽象方法;如何验证?使用@FunctionalInterface注解
该接口中只有一个抽象方法,所以是一个函数式接口;否则注解会提示错误异常
/*** 接口中有:* 全局常量* 抽象方法* 静态方法* 默认方法*/
//@FunctionalInterface 该注解是专门校验接口是否是一个函数式接口,如果校验成功,编译正常,反之编译报错
@FunctionalInterface
public interface NewFeaturesDemo {//全局常量 默认 public static finalint numberValue = 258;//抽象方法 默认public abstractvoid add();//静态方法static void add1(){System.out.println("是一个静态方法,有代码块!!!");}//默认方法【是Java8的新特性,Java8之前是没有默认方法的】default void add2(){System.out.println("是一个普通方法,ye有代码块!!!");}
}
单元测试
功能:一个类可以实现N个主方法,通过加注解@Test的方式,该一个注解即一个主方法
/*** 单元测试类*/
public class UnitTesting {@Testpublic void testAll1(){//访问全局常量System.out.println(NewFeaturesDemo.numberValue);//258}@Testpublic void testAll2(){//访问抽象方法new NewFeaturesDemo() {@Overridepublic void add() {System.out.println("我是一个抽象方法!!!");}}.add();//我是一个抽象方法!!!}@Testpublic void testAll3(){//访问静态方法NewFeaturesDemo.add1();//是一个静态方法,有代码块!!!}@Testpublic void testAll4(){//访问默认方法new NewFeaturesDemo() {@Overridepublic void add() {}}.add2();//是一个普通方法,ye有代码块!!!}
}
注意:鼠标在哪个区域则运行结果即该主方法区域结果,或在对应注解前有运行按钮
Java8主要新特性
A、Lambda 表达式及方法引用【一般联合使用】
使用Lambda 表达式的前提:抽象类或者接口中只能有一个抽象方法即必须是一个函数式接口
适用范围:(初始者)只有抽象方法或者接口才能使用Lambda 表达式,类也可以但使用比较小众
无参无返回值的抽象方法——Lambda 表达式
/*** 无参数,无返回值*/
//@FunctionalInterface 该注解是专门校验接口是否是一个函数式接口
@FunctionalInterface
public interface NewFeaturesDemo {//抽象方法 默认public abstractvoid add();
}
import org.junit.Test;
/*** 单元测试类*/
public class UnitTesting {@Testpublic void testAll(){//【无参无返回值】访问抽象方法——使用传统方式NewFeaturesDemo newFeaturesDemo = new NewFeaturesDemo() {@Overridepublic void add() {System.out.println("我是一个抽象方法!!!");}};newFeaturesDemo.add();//我是一个抽象方法!!!}@Testpublic void testAll1(){//【无参无返回值】访问抽象方法——使用Lambda 表达式方式 1NewFeaturesDemo newFeaturesDemo = () -> {System.out.println("我是一个抽象方法!!!");};//因为该接口里面只有一个抽象方法,所以用括号表示,括号里面关乎抽象方法里面是否有的参数newFeaturesDemo.add();//我是一个抽象方法!!!}@Testpublic void testAll2(){//【无参无返回值】访问抽象方法——使用Lambda 表达式方式 2//如果重写方法内部的代码内容只有一句代码,那么{}是可以省略不要的NewFeaturesDemo newFeaturesDemo = () -> System.out.println("我是一个抽象方法!!!");//因为该接口里面只有一个抽象方法,所以用括号表示,括号里面关乎抽象方法里面是否有的参数newFeaturesDemo.add();//我是一个抽象方法!!!}
}
有参有返回值——一个参数的抽象方法——Lambda 表达式
/*** 有参数,有返回值【一个参数】*/
//@FunctionalInterface 该注解是专门校验接口是否是一个函数式接口
@FunctionalInterface
public interface NewFeaturesDemo {//抽象方法 默认public abstractString add(String describe);
}
import org.junit.Test;
/*** 单元测试类*/
public class UnitTesting {@Testpublic void testAll(){//【有参有返回值——一个参数】访问抽象方法——使用传统方式NewFeaturesDemo newFeaturesDemo = new NewFeaturesDemo() {@Overridepublic String add(String describe) {return describe + "我是一个抽象方法!!!";}};//有返回值必须输出或者被接收,不能直接调用String add = newFeaturesDemo.add("使用传统方式");System.out.println(add);//使用传统方式我是一个抽象方法!!!}@Testpublic void testAll1(){//【有参有返回值——一个参数】访问抽象方法——使用Lambda 表达式方式 1NewFeaturesDemo newFeaturesDemo = (String describe) -> {return describe + "我是一个抽象方法!!!";};//有返回值必须输出或者被接收,不能直接调用String add = newFeaturesDemo.add("使用Lambda优化1");System.out.println(add);//使用Lambda优化1我是一个抽象方法!!!}@Testpublic void testAll2(){//【有参有返回值——一个参数】访问抽象方法——使用Lambda 表达式方式 2//如果重写方法内部的代码内容只有一句代码,那么{}是可以省略不要的,并且如果方法是有返回值的,return也必须省略掉否则编译报错NewFeaturesDemo newFeaturesDemo = (String describe) -> describe + "我是一个抽象方法!!!";//有返回值必须输出或者被接收,不能直接调用String add = newFeaturesDemo.add("使用Lambda优化2");System.out.println(add);//使用Lambda优化2我是一个抽象方法!!!}@Testpublic void testAll3(){//【有参有返回值——一个参数】访问抽象方法——使用Lambda 表达式方式 3//如果重写方法内部的代码内容只有一句代码,那么{}是可以省略不要的,并且如果方法是有返回值的,return也必须省略掉否则编译报错//如果在方法中形参类型都是可以省略不要的,它会自己类型推断//如果形参列表只有1个,()也是可以省略不要的,但是注意了,如果形参列表有多个()是不可以省略的//后面的变量名可以随意,不影响执行NewFeaturesDemo newFeaturesDemo = describeXxxxx -> describeXxxxx + "我是一个抽象方法!!!";//有返回值必须输出或者被接收,不能直接调用String add = newFeaturesDemo.add("使用Lambda优化3");System.out.println(add);//使用Lambda优化3我是一个抽象方法!!!}
}
有参有返回值——多个参数的抽象方法——Lambda 表达式
/*** 有参数,有返回值【多个参数】*/
//@FunctionalInterface 该注解是专门校验接口是否是一个函数式接口
@FunctionalInterface
public interface NewFeaturesDemo {//抽象方法 默认public abstractString add(String describe,String describe1,String describe2);
}
import org.junit.Test;
/*** 单元测试类*/
public class UnitTesting {@Testpublic void testAll(){//【有参有返回值——多个参数】访问抽象方法——使用传统方式NewFeaturesDemo newFeaturesDemo = new NewFeaturesDemo() {@Overridepublic String add(String describe, String describe1, String describe2) {return describe + describe1 + describe2 + "我是一个抽象方法!!!";}};//有返回值必须输出或者被接收,不能直接调用String add = newFeaturesDemo.add("使用", "传统", "方式");System.out.println(add);//使用传统方式我是一个抽象方法!!!}@Testpublic void testAll1(){//【有参有返回值——多个参数】访问抽象方法——使用Lambda 表达式方式 1//如果重写方法内部的代码内容只有一句代码,那么{}是可以省略不要的,并且如果方法是有返回值的,return也必须省略掉否则编译报错NewFeaturesDemo newFeaturesDemo = (String describe, String describe1, String describe2) -> describe + describe1 + describe2 + "我是一个抽象方法!!!";//有返回值必须输出或者被接收,不能直接调用String add = newFeaturesDemo.add("使用", "Lambda优化1", "方式");System.out.println(add);//使用Lambda优化1方式我是一个抽象方法!!!}@Testpublic void testAll2(){//【有参有返回值——多个参数】访问抽象方法——使用Lambda 表达式方式 2//如果重写方法内部的代码内容只有一句代码,那么{}是可以省略不要的,并且如果方法是有返回值的,return也必须省略掉否则编译报错//方法形参列表内部的数据类型都是可以省略不要的NewFeaturesDemo newFeaturesDemo = (describe,describe1,describe2) -> describe + describe1 + describe2 + "我是一个抽象方法!!!";//有返回值必须输出或者被接收,不能直接调用String add = newFeaturesDemo.add("使用", "Lambda优化2", "方式");System.out.println(add);//使用Lambda优化2方式我是一个抽象方法!!!}
}
无参有返回值的抽象方法——Lambda 表达式
/*** 无参数,有返回值*/
//@FunctionalInterface 该注解是专门校验接口是否是一个函数式接口
@FunctionalInterface
public interface NewFeaturesDemo {//抽象方法 默认public abstractString add();
}
import org.junit.Test;
/*** 单元测试类*/
public class UnitTesting {@Testpublic void testAll() {//【无参有返回值】访问抽象方法——使用传统方式NewFeaturesDemo newFeaturesDemo = new NewFeaturesDemo() {@Overridepublic String add() {return "使用传统方式我是一个抽象方法!!!";}};//有返回值必须输出或者被接收,不能直接调用String add = newFeaturesDemo.add();System.out.println(add);//使用传统方式我是一个抽象方法!!!}@Testpublic void testAll1() {//【无参有返回值】访问抽象方法——使用Lambda 表达式方式//如果重写方法内部的代码内容只有一句代码,那么{}是可以省略不要的,并且如果方法是有返回值的,return也必须省略掉否则编译报错NewFeaturesDemo newFeaturesDemo = () -> "使用Lambda 表达式方式我是一个抽象方法!!!";//有返回值必须输出或者被接收,不能直接调用String add = newFeaturesDemo.add();System.out.println(add);//使用Lambda 表达式方式我是一个抽象方法!!!}
}
有参无返回值——一个参数的抽象方法——Lambda 表达式
/*** 有参数,无返回值【一个参数】*/
//@FunctionalInterface 该注解是专门校验接口是否是一个函数式接口
@FunctionalInterface
public interface NewFeaturesDemo {//抽象方法 默认public abstractvoid add(String describe);
}
import org.junit.Test;
/*** 单元测试类*/
public class UnitTesting {@Testpublic void testAll(){//【有参无返回值——一个参数】访问抽象方法——使用传统方式NewFeaturesDemo newFeaturesDemo = new NewFeaturesDemo() {@Overridepublic void add(String describe) {System.out.println(describe + "我是一个抽象方法!!!");}};//无返回值直接方法调用即可newFeaturesDemo.add("使用传统方式");//使用传统方式我是一个抽象方法!!!}@Testpublic void testAll1(){//【有参无返回值——一个参数】访问抽象方法——使用Lambda 表达式方式//如果重写方法内部的代码内容只有一句代码,那么{}是可以省略不要的,并且如果方法是有返回值的,return也必须省略掉否则编译报错//方法形参列表内部的数据类型都是可以省略不要的//如果形参列表只有1个,()也是可以省略不要的,但是注意了,如果形参列表有多个()是不可以省略的NewFeaturesDemo newFeaturesDemo = describe -> System.out.println(describe + "我是一个抽象方法!!!");//无返回值直接方法调用即可newFeaturesDemo.add("使用Lambda 表达式方式");//使用Lambda 表达式方式我是一个抽象方法!!!}
}
有参无返回值——多个参数的抽象方法——Lambda 表达式
/*** 有参数,无返回值【多个参数】*/
//@FunctionalInterface 该注解是专门校验接口是否是一个函数式接口
@FunctionalInterface
public interface NewFeaturesDemo {//抽象方法 默认public abstractvoid add(String describe,String describe1,String describe2);
}
import org.junit.Test;
/*** 单元测试类*/
public class UnitTesting {@Testpublic void testAll(){//【有参无返回值——多个参数】访问抽象方法——使用传统方式NewFeaturesDemo newFeaturesDemo = new NewFeaturesDemo() {@Overridepublic void add(String describe, String describe1, String describe2) {System.out.println(describe + describe1 + describe2 + "我是一个抽象方法!!!");}};//无返回值直接方法调用即可newFeaturesDemo.add("使用","传统","方式");//使用传统方式我是一个抽象方法!!!}@Testpublic void testAll1(){//【有参无返回值——多个参数】访问抽象方法——使用Lambda 表达式方式//如果重写方法内部的代码内容只有一句代码,那么{}是可以省略不要的,并且如果方法是有返回值的,return也必须省略掉否则编译报错//方法形参列表内部的数据类型都是可以省略不要的//如果形参列表只有1个,()也是可以省略不要的,但是注意了,如果形参列表有多个()是不可以省略的NewFeaturesDemo newFeaturesDemo = (describe,describe1,describe2) -> System.out.println(describe + describe1 + describe2 + "我是一个抽象方法!!!");/