首页 > 其他分享 >JDK版本特性(一)JDK8

JDK版本特性(一)JDK8

时间:2023-12-18 13:13:21浏览次数:35  
标签:JDK System 接口 JDK8 版本 println Lambda public out

Java8新特性

  • 速度更快:如HashMap底层使用红黑树
  • 代码更少
  • 强大的Stream API
  • 便于并行
  • 最大化减少空指针异常:Optional
  • Nashorn引擎:在JVM上运行JS应用

1 Lambda表达式

1.1 Lambda表达式的格式
(o1, o2) -> Integer.compare(o1, o2)
  • ->:lambda操作符 或者 箭头操作符
  • 左边:lambda形参列表,也即是接口中抽象方法的形参列表
  • 右边:lambda体重写的抽象方法的方法体
  • Lambda表达式的本质是作为接口的实例
1.2 为什么使用Lambda表达式
  • Lambda表达式是一个匿名函数,可以理解为一段可以传递的代码(将代码像数据一样进行传递)
  • 可以写出更简洁、更灵活的代码
  • Lambda表达式只能用于只含有一个抽象方法的、并且被@FunctionalInterface标识的接口
  • ->即为Lambda操作符或者箭头操作符
  • :: 为方法引用
    public static void main(String[] args) {
        Runnable runnable1 = new Runnable() {
            @Override
            public void run() {
                System.out.println("111");
            }
        };
        runnable1.run();

        Runnable runnable2 = () -> {
            System.out.println("222");
        };
        runnable2.run();

        Comparator<Integer> comparator1 = new Comparator<>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return Integer.compare(o1, o2);
            }
        };
        System.out.println(comparator1.compare(1, 2));

        Comparator<Integer> comparator2 = (o1, o2) -> Integer.compare(o1, o2);
        System.out.println(comparator2.compare(2, 1));

        Comparator<Integer> comparator3 = Integer::compare;
        System.out.println(comparator3.compare(1, 1));

    }
1.3 Lambda的使用

​ 总结:

  • ->左边的Lambda形参列表
    • Lambda形参列表的参数类型都可以省略(类型推断)
    • 如果只有一个参数则可以省略小括号
  • ->右边的Lambda体
    • 如果只有一条执行语句,则可以省略大括号,如果有返回值,return关键字需要省略

​ 情况举例:

  • 1 无参、无返回值:

            Runnable runnable2 = () -> {
                System.out.println("222");
            };
            runnable2.run();
    
  • 2 需要参数,但无返回值:

    Consumer<String> consumer = new Consumer<String>() {
                @Override
                public void accept(String s) {
                    System.out.println(s);
                }
            };
            consumer.accept("123");
    
            Consumer<String> consumer1 = (String s) -> {
                System.out.println(s);
            };
            consumer1.accept("123");
    
  • 3 数据类型可以省略,因为编译器可以推断得出,称为类型推断,像使用泛型创建对象的时候就不必写后面的类型,也是一种编译时的类型推断

            Consumer<String> consumer1 = (s) -> {
                System.out.println(s);
            };
            consumer1.accept("123");
    
  • 4 Lambda若只需要一个参数,则参数的小括号可以省略

            Consumer<String> consumer1 = s -> {
                System.out.println(s);
            };
            consumer1.accept("123");
    
  • 5 Lambda需要两个或者两个以上的参数,且可以有返回值

            Comparator<Integer> comparator2 = (o1, o2) -> {
                return Integer.compare(o1, o2);
            };
    
  • 6 如果语句只有一条,则大括号可以省略,且带返回值的return可以省略

            Comparator<Integer> comparator2 = (o1, o2) -> Integer.compare(o1, o2);
            System.out.println(comparator2.compare(2, 1));
    

2 函数式接口

  • Lambda在使用的时候,准确来说是作为函数式接口的实例存在

  • 如果接口中只声明了一个抽象方法,则这个接口就是函数式接口

  • @FunctinalInterface仅仅起到一个标识检查的作用,检查标识的接口是否满足函数式接口的定义

    @FunctionalInterface
    public interface MyFunctionalInterface {
        void method1();
        //void method2();
    }
    
  • 以前使用匿名实现类表示的,现在都可以使用Lambda表达式来写

2.1 Java内置的四大核心函数式接口

​ 出现这四种接口,均可以使用Lambda表达式进行接口实例化

  • 消费型接口 Consumer<T>:void accept(T t),有参数无返回值

    public class LambdaTest2 {
        @Test
        public void test() {
            happyTime(500, money -> System.out.println("消费" + 500));
            happyTime(500, System.out::println);
        }
    
        public void happyTime(double money, Consumer<Double> consumer) {
            consumer.accept(money);
        }
    }
    
    
  • 供给型接口 Supplier:T get(),无参数有返回值

  • 函数型接口 Funcational<R, T>:R apply(T t),有参数有返回值

  • 断定型接口 Predicate<T>:boolean test(T t),有参数,有返回值且为boolean

        @Test
        public void test() {
            //happyTime(500, money -> System.out.println("消费" + 500));
            List<String> list = Arrays.asList("北京", "南京", "天津");
            List<String> strings = filterString(list, str -> str.contains("京"));
            System.out.println(strings);
        }
    
    	public List<String> filterString(List<String> list, Predicate<String> predicate) {
            List<String> filterStringList = new ArrayList<>();
            for(String str : list) {
                if(predicate.test(str)) {
                    filterStringList.add(str);
                }
            }
            return filterStringList;
        }
    
2.2 其他接口

3 方法引用

  • 当要传递给Lambda体的操作,已经有相同的实现方法的时候,就可以使用方法引用

    相同的实现方法要求实现接口的抽象方法的参数列表和返回值类型必须和参数引用的一致

  • 方法引用就是一个lambda表达式,也就是函数接口的一个实例

  • 就是通过方法的名字指向一个方法,可以认为是Lambda的一个语法糖

  • 具体分为下面三种情况:

    • 对象 :: 非静态方法
    • 类 :: 静态方法
    • 类 :: 非静态方法

类 :: 静态方法

    @Test
    public void test1() {
        Consumer<String> consumer = str -> System.out.println(str);
        consumer.accept("Hello");


        Consumer<String> consumer1 = System.out::println;
        consumer.accept("World!");
    }

如Consumer的参数列表返回值类型和方法引用System.out::println的相同,因此可以直接使用方法引用进行替换。

对象 :: 非静态方法

    @Test
    public void test2() {
        Employee employee = new Employee(1001L, "Tom", 5600.0);
        //Supplier<String> supplier = () -> employee.getName();
        Supplier<String> supplier = employee::getName;
        System.out.println(supplier.get());

    }

4 构造器引用

  • 和方法引用类似

  • 无参构造器对应supplier供给型接口 T get()

    @Test
    public void test() {
        Supplier<Employee> sup = new Supplier<Employee>() {
            @Override
            public Employee get() {
                return new Employee();
            }
        };
        System.out.println(sup.get());
        
        Supplier<Employee> sup1 = Employee::new;
        System.out.println(sup1.get());
    }
    
  • 有参构造器对应Function函数型接口 R apply(T t),如果有两个参数则使用BiFunction R apply(T t, S s)

        @Test
        public void testAllConstruct() {
            Function<String, Employee> fun = Employee::new;
            System.out.println(fun.apply("zhang san"));
    
        }
    
        @Test
        public void testBiAllConstructor() {
            BiFunction<String, Integer, Employee> fun = Employee::new;
            System.out.println(fun.apply("zhangsan", 18));
        }
    

5 数组引用

    @Test
    public void testArrayRef() {
        Function<Integer, String[]> fun = new Function<Integer, String[]>() {
            @Override
            public String[] apply(Integer integer) {
                return new String[integer];
            }
        } ;
        System.out.println(Arrays.toString(fun.apply(10)));

        Function<Integer, String[]> fun2 = String[]::new;
        System.out.println(Arrays.toString(fun2.apply(10)));
    }

标签:JDK,System,接口,JDK8,版本,println,Lambda,public,out
From: https://www.cnblogs.com/tod4/p/17910955.html

相关文章

  • spirng、springboot、jdk、maven、tomcat版本问题
    引入springboot依赖时会自动安装spring对应依赖,版本由springboot决定。springboot2.x.x及以下使用jdk11、jdk8都可以,springboot3.x.x最低要求jdk17maven与jdk版本关系,参照链接:https://maven.apache.org/docs/history.htmlApacheTomcat是JakartaEE(JavaEE)技术子集的开源......
  • 新增“失窃设备保护”:苹果发布iOS 17.3测试版本
    12月13日消息,在昨天发布iOS17.2正式版之后,今天苹果向开发者推送了iOS17.3Beta版本更新,新增了“失窃设备保护”功能。iOS17.3首个Beta版本更新引入了“设备被盗保护”(StolenDeviceProtection)功能,可以在小偷或其他攻击者知道用户的私人密码时保护用户信息。当此功能开启后,如......
  • linux 进程间通信 --- 共享内存(POSIX 版本)
    POSIX进程间通信POSIX进程间通信(InterprocessCommunication,IPC)是SystemV进程间通信的变体。它是在Solaris7发行版中引入的。与SystemV对象类似,POSIXIPC对象的属主、属主的组以及其他用户具有读取和写入权限,但是没有执行权限。POSIXIPC对象的属主无法将对象......
  • 数据库版本历史的总结-非信创部分
    数据库版本历史的总结-非信创部分OracleOracle数据库是最悠久的关系型数据库.诞生于美国军方的管理项目他的第一个版本是Oracle2上世纪八九十年代的Oracle8和Oracle9是非常成功的版本.进入21世纪后Oracle发布了三个大版本Oracle10goracle11goracle12c(Oracle9......
  • Windows利用nvm进行node版本控制(node 版本管理工具nvm的安装与使用)
    为什么需要对node进行版本管理?不同项目的node的版本并不相同,不同版本之间的兼容性并不好,所以需要工具(node版本管理工具)进行快速切换node版本。下载与安装(Windows)1.卸载电脑原有node直接去控制面板/win11设置卸载就行2.安装nvmGithub下载地址下载地址里面有两类nv......
  • 非动态数组版本下的筛选
    问题:一对多查找(筛选)的结果需要横向排列,但是表格暂时不支持动态数组。右拉下拉公式解决:{=IFERROR(INDEX(FILTER($E:$E,$D:$D=$G2),COLUMN(A1)),"")}公式中的Filter部分筛选出满总D列中等产于G2对应E列的内容,其结果是多个单元格组成的数组。使用Index提取数组中的内容,第......
  • Redis不同版本,内存分配,硬件的性能研究
    Redis不同版本,内存分配,硬件的性能研究前言Konwmore!Domore!Gainmore!骨折之后开始减肥.前段时间跳绳导致膝盖不舒服,现在改骑车和走路.在有限的没人有烦的时间里,还是想能够多学习一些东西.之前了解了isolcpus现在突然想内存分配可能也有性能影响.所以想研......
  • JDK&HDFS安装
    一、环境操作系统:CentOS7.964位JDK版本:8HADOOP版本:3.3.0二、安装包:2.1JDK百度网盘地址及提取码:地址:https://pan.baidu.com/s/1sbgLPROfd9e_valSfv0YAQ 提取码:4qps2.2HADOOP百度网盘地址及提取码:地址:https://pan.baidu.com/s/180Q7Lbyyo6qpwyu1AAFR_Q 提取码:ras4......
  • 【JDK+jenkins+gitee实现CI/CD(之二)】 配置jenkins拉取gitee代码自动构建项目
    前面我们已经学习了如何在阿里云Linux环境中安装jenkins和java环境这一节我们来配置已经安装好了的jenkins,并拉取GITEE上的仓库代码来自动构建项目一,安装jenkins必须的插件汉化插件Chinese,如果安装的jenkins自动中文片,可以跳过这一些安装gitee插件[GiteePlugin]安装docker......
  • tomcat版本和jdk版本的对应
    tomcat的版本也不易太老,否则会导致理论和实际不相适应:(尽量使用tomcat8.x、tomcat8.5、tomcat9) Tomcat10巨坑结论:tomcat9和tomcat10的依赖包不是同一个。\color{#FF3030}{结论:tomcat9和tomcat10的依赖包不是同一个。}结论:tomcat9和tomcat1......