Java8新特性_加强版

发布于:2025-06-26 ⋅ 阅读:(13) ⋅ 点赞:(0)

Java8(又称jdk1.8)是Java语言开发的一个主要版本(即大版本)【对于新特性需使用API文档时,用1.8版本,否则查看不到】

函数式编程:简单理解就是把方法作为一个实参进行传递

函数式接口:一个接口中只有一个抽象方法;如何验证?使用@FunctionalInterface注解

该接口中只有一个抽象方法,所以是一个函数式接口;否则注解会提示错误异常
/**
 * 接口中有:
 *      全局常量
 *      抽象方法
 *      静态方法
 *      默认方法
 */
//@FunctionalInterface 该注解是专门校验接口是否是一个函数式接口,如果校验成功,编译正常,反之编译报错
@FunctionalInterface
public interface NewFeaturesDemo {
   
    //全局常量 默认 public static final
    int numberValue = 258;
    //抽象方法 默认public abstract
    void add();
    //静态方法
    static void add1(){
   
        System.out.println("是一个静态方法,有代码块!!!");
    }
    //默认方法【是Java8的新特性,Java8之前是没有默认方法的】
    default void add2(){
   
        System.out.println("是一个普通方法,ye有代码块!!!");
    }
}

单元测试

功能:一个类可以实现N个主方法,通过加注解@Test的方式,该一个注解即一个主方法

/**
 * 单元测试类
 */
public class UnitTesting {
   
    @Test
    public void testAll1(){
   
        //访问全局常量
        System.out.println(NewFeaturesDemo.numberValue);//258
    }
    @Test
    public void testAll2(){
   
        //访问抽象方法
        new NewFeaturesDemo() {
   
            @Override
            public void add() {
   
                System.out.println("我是一个抽象方法!!!");
            }
        }.add();//我是一个抽象方法!!!
    }
    @Test
    public void testAll3(){
   
        //访问静态方法
        NewFeaturesDemo.add1();//是一个静态方法,有代码块!!!
    }
    @Test
    public void testAll4(){
   
        //访问默认方法
        new NewFeaturesDemo() {
   
            @Override
            public void add() {
   
            }
        }.add2();//是一个普通方法,ye有代码块!!!
    }
}
注意:鼠标在哪个区域则运行结果即该主方法区域结果,或在对应注解前有运行按钮

Java8主要新特性

A、Lambda 表达式及方法引用【一般联合使用】

使用Lambda 表达式的前提:抽象类或者接口中只能有一个抽象方法即必须是一个函数式接口

适用范围:(初始者)只有抽象方法或者接口才能使用Lambda 表达式,类也可以但使用比较小众

无参无返回值的抽象方法——Lambda 表达式

/**
 * 无参数,无返回值
 */
//@FunctionalInterface 该注解是专门校验接口是否是一个函数式接口
@FunctionalInterface
public interface NewFeaturesDemo {
   
    //抽象方法 默认public abstract
    void add();
}
import org.junit.Test;
/**
 * 单元测试类
 */
public class UnitTesting {
   
    @Test
    public void testAll(){
   
        //【无参无返回值】访问抽象方法——使用传统方式
        NewFeaturesDemo newFeaturesDemo = new NewFeaturesDemo() {
   
            @Override
            public void add() {
   
                System.out.println("我是一个抽象方法!!!");
            }
        };
        newFeaturesDemo.add();//我是一个抽象方法!!!
    }
    @Test
    public void testAll1(){
   
        //【无参无返回值】访问抽象方法——使用Lambda 表达式方式 1
        NewFeaturesDemo newFeaturesDemo = () -> {
   
            System.out.println("我是一个抽象方法!!!");
        };//因为该接口里面只有一个抽象方法,所以用括号表示,括号里面关乎抽象方法里面是否有的参数
        newFeaturesDemo.add();//我是一个抽象方法!!!
    }
    @Test
    public void testAll2(){
   
        //【无参无返回值】访问抽象方法——使用Lambda 表达式方式 2
        //如果重写方法内部的代码内容只有一句代码,那么{}是可以省略不要的
        NewFeaturesDemo newFeaturesDemo = () -> System.out.println("我是一个抽象方法!!!");
        //因为该接口里面只有一个抽象方法,所以用括号表示,括号里面关乎抽象方法里面是否有的参数
        newFeaturesDemo.add();//我是一个抽象方法!!!
    }
}

有参有返回值——一个参数的抽象方法——Lambda 表达式

/**
 * 有参数,有返回值【一个参数】
 */
//@FunctionalInterface 该注解是专门校验接口是否是一个函数式接口
@FunctionalInterface
public interface NewFeaturesDemo {
   
    //抽象方法 默认public abstract
    String add(String describe);
}
import org.junit.Test;
/**
 * 单元测试类
 */
public class UnitTesting {
   
    @Test
    public void testAll(){
   
        //【有参有返回值——一个参数】访问抽象方法——使用传统方式
        NewFeaturesDemo newFeaturesDemo = new NewFeaturesDemo() {
   
            @Override
            public String add(String describe) {
   
                return describe + "我是一个抽象方法!!!";
            }
        };
        //有返回值必须输出或者被接收,不能直接调用
        String add = newFeaturesDemo.add("使用传统方式");
        System.out.println(add);//使用传统方式我是一个抽象方法!!!
    }
    @Test
    public void testAll1(){
   
        //【有参有返回值——一个参数】访问抽象方法——使用Lambda 表达式方式 1
        NewFeaturesDemo newFeaturesDemo = (String describe) -> {
   
                return describe + "我是一个抽象方法!!!";
        };
        //有返回值必须输出或者被接收,不能直接调用
        String add = newFeaturesDemo.add("使用Lambda优化1");
        System.out.println(add);//使用Lambda优化1我是一个抽象方法!!!
    }
    @Test
    public void testAll2(){
   
        //【有参有返回值——一个参数】访问抽象方法——使用Lambda 表达式方式 2
        //如果重写方法内部的代码内容只有一句代码,那么{}是可以省略不要的,并且如果方法是有返回值的,return也必须省略掉否则编译报错
        NewFeaturesDemo newFeaturesDemo = (String describe) -> describe + "我是一个抽象方法!!!";
        //有返回值必须输出或者被接收,不能直接调用
        String add = newFeaturesDemo.add("使用Lambda优化2");
        System.out.println(add);//使用Lambda优化2我是一个抽象方法!!!
    }
    @Test
    public 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 abstract
    String add(String describe,String describe1,String describe2);
}
import org.junit.Test;
/**
 * 单元测试类
 */
public class UnitTesting {
   
    @Test
    public void testAll(){
   
        //【有参有返回值——多个参数】访问抽象方法——使用传统方式
        NewFeaturesDemo newFeaturesDemo = new NewFeaturesDemo() {
   
            @Override
            public String add(String describe, String describe1, String describe2) {
   
                return describe + describe1 + describe2 + "我是一个抽象方法!!!";
            }
        };
        //有返回值必须输出或者被接收,不能直接调用
        String add = newFeaturesDemo.add("使用", "传统", "方式");
        System.out.println(add);//使用传统方式我是一个抽象方法!!!
    }
    @Test
    public 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方式我是一个抽象方法!!!
    }
    @Test
    public 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 abstract
    String add();
}
import org.junit.Test;
/**
 * 单元测试类
 */
public class UnitTesting {
   
    @Test
    public void testAll() {
   
        //【无参有返回值】访问抽象方法——使用传统方式
        NewFeaturesDemo newFeaturesDemo = new NewFeaturesDemo() {
   
            @Override
            public String add() {
   
                return "使用传统方式我是一个抽象方法!!!";
            }
        };
        //有返回值必须输出或者被接收,不能直接调用
        String add = newFeaturesDemo.add();
        System.out.println(add);//使用传统方式我是一个抽象方法!!!
    }

    @Test
    public void testAll1() {
   
        //【无参有返回值】访问抽象方法——使用Lambda 表达式方式
        //如果重写方法内部的代码内容只有一句代码,那么{}是可以省略不要的,并且如果方法是有返回值的,return也必须省略掉否则编译报错
        NewFeaturesDemo newFeaturesDemo = () -> "使用Lambda 表达式方式我是一个抽象方法!!!";
        //有返回值必须输出或者被接收,不能直接调用
        String add = newFeaturesDemo.add();
        System.out.println(add);//使用Lambda 表达式方式我是一个抽象方法!!!
    }
}

有参无返回值——一个参数的抽象方法——Lambda 表达式

/**
 * 有参数,无返回值【一个参数】
 */
//@FunctionalInterface 该注解是专门校验接口是否是一个函数式接口
@FunctionalInterface
public interface NewFeaturesDemo {
   
    //抽象方法 默认public abstract
    void add(String describe);
}
import org.junit.Test;
/**
 * 单元测试类
 */
public class UnitTesting {
   
    @Test
    public void testAll(){
   
        //【有参无返回值——一个参数】访问抽象方法——使用传统方式
        NewFeaturesDemo newFeaturesDemo = new NewFeaturesDemo() {
   
            @Override
            public void add(String describe) {
   
                System.out.println(describe + "我是一个抽象方法!!!");
            }
        };
        //无返回值直接方法调用即可
        newFeaturesDemo.add("使用传统方式");//使用传统方式我是一个抽象方法!!!
    }
    @Test
    public void testAll1(){
   
        //【有参无返回值——一个参数】访问抽象方法——使用Lambda 表达式方式
        //如果重写方法内部的代码内容只有一句代码,那么{}是可以省略不要的,并且如果方法是有返回值的,return也必须省略掉否则编译报错
        //方法形参列表内部的数据类型都是可以省略不要的
        //如果形参列表只有1个,()也是可以省略不要的,但是注意了,如果形参列表有多个()是不可以省略的
        NewFeaturesDemo newFeaturesDemo = describe -> System.out.println(describe + "我是一个抽象方法!!!");
        //无返回值直接方法调用即可
        newFeaturesDemo.add("使用Lambda 表达式方式");//使用Lambda 表达式方式我是一个抽象方法!!!
    }
}

有参无返回值——多个参数的抽象方法——Lambda 表达式

/**
 * 有参数,无返回值【多个参数】
 */
//@FunctionalInterface 该注解是专门校验接口是否是一个函数式接口
@FunctionalInterface
public interface NewFeaturesDemo {
   
    //抽象方法 默认public abstract
    void add(String describe,String describe1,String describe2);
}
import org.junit.Test;
/**
 * 单元测试类
 */
public class UnitTesting {
   
    @Test
    public void testAll(){
   
        //【有参无返回值——多个参数】访问抽象方法——使用传统方式
        NewFeaturesDemo newFeaturesDemo = new NewFeaturesDemo() {
   
            @Override
            public void add(String describe, String describe1, String describe2) {
   
                System.out.println(describe + describe1 + describe2 + "我是一个抽象方法!!!");
            }
        };
        //无返回值直接方法调用即可
        newFeaturesDemo.add("使用","传统","方式");//使用传统方式我是一个抽象方法!!!
    }
    @Test
    public void testAll1(){
   
        //【有参无返回值——多个参数】访问抽象方法——使用Lambda 表达式方式
        //如果重写方法内部的代码内容只有一句代码,那么{}是可以省略不要的,并且如果方法是有返回值的,return也必须省略掉否则编译报错
        //方法形参列表内部的数据类型都是可以省略不要的
        //如果形参列表只有1个,()也是可以省略不要的,但是注意了,如果形参列表有多个()是不可以省略的
        NewFeaturesDemo newFeaturesDemo = (describe,describe1,describe2) -> System.out.println(describe + describe1 + describe2 + "我是一个抽象方法!!!");
        /

网站公告

今日签到

点亮在社区的每一天
去签到