【Java】全面理解Java8特性

目录

一、Java8中Interface接口

二、lambda表达式

语法格式

三、函数式接口Functional Interface

1. 作用

2. 内置函数式接(Built-in Functional Interfaces)

Predicate接口

Function

Comparator

四、Stream

1. Filter 过滤

2. Sorted 排序

3. Map 映射

4. Match 匹配

5. Collect收集

6. Statistics 统计 

7. 函数式接口总结

五、日期时间

1. 格式化

2. 字符串转日期格式

3. 日期计算

4. 获取指定日期


一、Java8中Interface接口

        Java8 中,接口中除了抽象方法外,还可以定义default 默认方法和 static 静态方法

        default 修饰的默认方法,属于实例方法,可以被实现类调用或重写。

                调用:实现类必须 implements 接口,才能调用该接口的 default 默认方法。         

                重写:实现类 implements不同接口时,接口中存在相同签名的方法(名称、参数、类型完全一致),则实现类必须重写该方法明确方法定义;
                
        static 修饰的静态方法,属于类的静态方法。但它不能被子类继承,只能用 interface 接口名称调用。

二、lambda表达式

        Lambda表达式本质是一个匿名函数,用于把函数作为参数,传入方法中,实现函数式编程风格。

        使用 Lambda表达式可以使代码变的更加简洁紧凑。 

语法格式

        (parameters)->expression(parameters)->{statements;}

    public static void main(String[] args) {List<String> list = new ArrayList<>(Arrays.asList("s","sjv","safa","safth"));// Comparator接口的匿名实现方式(传统)
//        list.sort(new Comparator<String>() {
//            @Override
//            public int compare(String o1, String o2) {
//                return o1.length()-o2.length();
//            }
//        });// lambda表达式的语法规则:(参数) -> {方法实现逻辑}// 使用lambda表达式,@FunctionalInterface接口,只有一个抽象方法(无方法体)// 通过lambda表达式实现Comparator接口list.sort((s1, s2) -> {return s1.length()-s2.length();});// 通过lambda表达式实现Consumer接口list.forEach((str)->{System.out.println(str.toUpperCase());});System.out.println(list);}

三、函数式接口Functional Interface

        只有一个抽象方法的接口(可以定义多个非抽象方法)。可以使用 @FunctionalInterface 接
口定义,强化语义规范。
        函数式接口,也被称为SAM接口(Single Abstract Method Interfaces)。

1. 作用

        基于函数式接口,可以使用Lambda 表达式进行实现,实现函数式编程

2. 内置函数式接(Built-in Functional Interfaces)

        在 Java 8中专门有一个包放函数式接口 java.util.function,该包下的所有接口都有 @FunctionalInterface 注解,提供函数式编程方式。

        Predicate接口

        Predicate 接口是只有一个参数的返回布尔类型值的 断言型 接口。该接口包含多种默认方法来将Predicate 组合成其他复杂的逻辑(比如:与 and,或or,非negate)。

    public static void main(String[] args) {
//        Predicate predicate = new Predicate() {
//            @Override
//            public boolean test(Object o) {
//                return false;
//            }
//        };List<String> arrayList = new ArrayList<>(Arrays.asList("Basic","QBasic","c","c++","PowerBuilder","go"));// 查找名称小于3个字符的元素Predicate<String> predicate1 = (lang)-> {if (lang.length()<=3) {return true;}return false;};// 查询前缀以“b"或”c“开头的元素Predicate<String> predicate2 = (lang)->{if (lang.toLowerCase().startsWith("b")||lang.toLowerCase().startsWith("c")){return true;}return false;};// 条件组合:形成”与“ 或 ”或“逻辑关系Predicate<String> predicate3 = predicate1.and(predicate2);Predicate<String> predicate4 = predicate1.or(predicate2);// ”非“逻辑 (取反)Predicate<String> predicate5 = predicate1.negate();  // >3arrayList.forEach((lang)->{if (predicate1.test(lang)){System.out.println(lang);}});}
        Function

        Function 接口接受一个参数并生成结果。默认方法可用于将多个函数链接在一起(composeandThen)。

    public static void main(String[] args) {List<String> list = new ArrayList<>(Arrays.asList("Basic", "QBasic", "c", "c++", "PowerBuilder", "go"));// Function<参数类型,返回值类型>// 转换成大写字母形式Function<String, String> fun1 = (lang) -> {lang = lang.toUpperCase();return lang;};// 加上【】Function<String, String> fun2 = (lang) -> {lang = String.format("【%s】", lang);return lang;};// 组合Function<String, String> fun3 = fun1.andThen(fun2);  //先fun1,后fun2Function<String,String> fun4 = fun1.compose(fun2);list.forEach((lang) -> {String ret = fun3.apply(lang);System.out.println(ret);});}
        Comparator

        比较器接口,用于比较指定元素值的大小。 Java 8版本中,添加了多个新的 default 方法,用于比较器合并反转等操作。

    public static void main(String[] args) {List<String> list = Arrays.asList("Basic", "QBasic", "c", "c++", "PowerBuilder", "to","go");Comparator<String> comparator1 = (lang1, lang2) -> {int ret = lang1.compareTo(lang2);if (ret ==0){return lang1.length()-lang2.length();}return ret;};Comparator<String> comparable2 = comparator1.reversed();  // 反转list.sort(comparable2);list.forEach((lang)->{System.out.println(lang);});}

四、Stream

        java.util.Stream表示能应用在一组元素上一次执行的操作序列。
        Stream 操作分为中间操作或者最终操作两种,最终操作返回一特定类型的计算结果,而中间操作返回 stream 本身,可以连续完成多个操作。

1. Filter 过滤

        过滤通过一个 predicate 接口来过滤并只保留符合条件的元素,该操作属于中间操作。所以过滤后的结果,可以继续进行其它 stream操作(例如forEach,forEach需要一个函数来对过滤后的元素依次执行。 forEach 是一个最终操作)。

    public static void main(String[] args) {Stream<String> stream = Stream.of("Basic", "QBasic", "c", "c++", "PowerBuilder", "go", "BuilderPower");// 过滤所有小写字母内容的元素,并排序stream.filter((lang) -> {for (int i = 0; i < lang.length(); i++) {char c = lang.charAt(i);if (c > 'A' && c < 'Z') {return true;}}return false;}).sorted((c1, c2) -> {if (c1.length() == c2.length()) {return c1.compareTo(c2);} else {return c1.length() - c2.length();}}).forEach((lang) -> {System.out.println(lang);});}

2. Sorted 排序

        排序是一个 中间操作,返回的是排序好后的Stream 。(不影响原数据)

    public static void main(String[] args) {Stream<String> stream = Stream.of("Basic", "QBasic", "c", "c++", "PowerBuilder", "go", "BuilderPower");// 过滤所有小写字母内容的元素,并排序stream.filter((lang) -> {for (int i = 0; i < lang.length(); i++) {char c = lang.charAt(i);if (c > 'A' && c < 'Z') {return true;}}return false;}).sorted((c1, c2) -> {if (c1.length() == c2.length()) {return c1.compareTo(c2);} else {return c1.length() - c2.length();}}).forEach((lang) -> {System.out.println(lang);});}

3. Map 映射

        映射是一个中间操作,会将元素根据指定的 Function 接口来依次将元素转成另外的对象。

    public static void main(String[] args) {Stream<Integer> stream = Stream.of(10, 20, 30, 40, 50, 60);// 映射:对每一个元素进行一次处理stream.map((n) -> {return n + 1;}).forEach((n) -> {System.out.println(n);});List<String> stringList = Arrays.asList("afa", "asf", "afsa");//转换字符串为大写,降序后输出stringList.stream().map((item) -> {return item.toUpperCase();}).sorted((s1, s2) -> {return s1.compareTo(s2);}).forEach((item) -> {System.out.println(item);});}

4. Match 匹配

        Stream 提供了多种匹配操作,允许检测指定的 Predicate 是否匹配整个 Stream 。所有的匹配操作都是 最终操作 ,并返回一个boolean 类型的值。

    public static void main(String[] args) {List<String> stringList = Arrays.asList("gds","asfa","das");// allMatch:所有元素是否匹配boolean bool1 = stringList.stream().allMatch((item) -> {return item.length() == 3;});System.out.println(bool1);// anyMatch:任意元素是否匹配boolean bool2 = stringList.stream().anyMatch((item) -> {return item.length() == 3;});System.out.println(bool2);}

5. Collect收集

        收集是一个 最终操作,返回 stream 中元素集合,返回值类型是集合(List、set、Map)或 字符串。

    public static void main(String[] args) {List<String> stringList = Arrays.asList("1556","5612","8489");//将Stream流中的每个元素进行mapping映射操作后,然后收集至一个List集合//Collectors.mappingList<Integer> numberInt = stringList.stream().collect(Collectors.mapping(s -> Integer.parseInt(s) * 10, Collectors.toList()));System.out.println(numberInt);// 分组操作// Collectors.groupingBy// 按照元素的字符长度进行分组Stream<String> stream = Stream.of("Basic", "QBasic", "c", "c++", "PowerBuilder", "go","BuilderPower");Map<Integer, List<String>> resultMapGroup1 = stream.collect(Collectors.groupingBy(s -> s.length()));resultMapGroup1.forEach((k,v)->{System.out.println(k+":"+v);});
//        stream.collect(Collectors.groupingBy((s->s.length()))).forEach((k,v)->{
//            System.out.println(k+":"+v);
//        });// 按照元素的首字母进行分组stream = Stream.of("Basic", "QBasic", "c", "c++", "PowerBuilder", "go","BuilderPower");stream.collect(Collectors.groupingBy(s->s.charAt(0))).forEach((k,v)->{System.out.println(k+":"+v);});}
    public static void main(String[] args) {Stream<String> stream = Stream.of("Basic", "QBasic", "c", "c++", "PowerBuilder", "go","BuilderPower");// 分区操作(只有true和false)stream.collect(Collectors.partitioningBy(s->s.length()>3)).forEach((k,v)->{System.out.println(k+":"+v);});}

6. Statistics 统计 

        统计是一个最终操作,返回 Stream中元素的各类统计信息,返回值类型是 XXXConsumer。 

    public static void main(String[] args) {//统计操作List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9);// Stream ===> IntStreamIntStream intStream = list.stream().mapToInt(s -> s*10);IntSummaryStatistics statisticsResult = intStream.summaryStatistics();// 获取统计结果System.out.println("最大值:"+statisticsResult.getMax());System.out.println("最小值:"+statisticsResult.getMin());System.out.println("平均值:"+statisticsResult.getAverage());System.out.println("累加和:"+statisticsResult.getSum());}

7. 函数式接口总结

        a. Predicate、Function、Consumer、Comparator
        b. 通过链式编程,使得它可以方便地对数据进行链式处理。
        c. 方法参数都是函数式接口类型
        d. 一个stream 只能操作一次,操作完就关闭了,继续使用这个 stream会报错。Stream不保存数据,不改变数据源。

五、日期时间

  •      LocalDateTime  //日期+时间   format: yyyy-MM-ddTHH:mm:ss.SSS
  •      LocalDate  //日期   format: yyyy-MM-dd
  •      LocalTime  //时间   format: HH:mm:ss

1. 格式化

    public static void main(String[] args) {// 日期格式化// 默认格式: yyyy-MM-ddLocalDate date = LocalDate.now();System.out.println(String.format("Date Format:%s",date));// 默认格式:HH:mm:ssLocalTime time =LocalTime.now().withNano(0);System.out.println(String.format("Time Format:%s",time));LocalDateTime dateTime = LocalDateTime.now();// 自定义格式:yyyy-MM-dd HH:mm:ssDateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分ss秒");String dateTimeStr = dateTime.format(dateTimeFormatter);System.out.println(String.format("DateTime Format:%s",dateTimeStr));}

2. 字符串转日期格式

    public static void main(String[] args) {// 字符串格式的日期内容,转换为LocalDate等之类的日期对象// 按照指定的日期的时间域值进行转换LocalDate date1 = LocalDate.of(2024,9,11);System.out.println(date1);// 按照默认格式(yyyy-MM-dd)的字符串,使用parse()方法进行转换LocalDate date2 = LocalDate.parse("2024-09-11");System.out.println(date2);// 按照默认格式(yyyy-MM-ddTHH:mm:ss)LocalDateTime dateTime1 = LocalDateTime.of(2024,9,11,17,50,30);LocalDateTime dateTime2 =LocalDateTime.parse("2024-09-11T17:50:30");System.out.println(dateTime1);System.out.println(dateTime2);// 按照默认格式(HH:mm:ss)LocalTime time1 = LocalTime.of(17,50,30);LocalTime time2 =LocalTime.parse("17:50:30");System.out.println(time1);System.out.println(time2);}

3. 日期计算

    public static void main(String[] args) {// 字符串格式的日期时间String strDatetime ="2024年12月15日";// 将字符串格式的日期,转换为LocalDate类型的日期对象LocalDate date = LocalDate.parse(strDatetime, DateTimeFormatter.ofPattern("yyyy年MM月dd日"));System.out.println(date);// 20天前LocalDate date1 = date.plusDays(-20);System.out.println(date1);//20天后LocalDate date2 = date.plusDays(20);System.out.println(date2);}
    public static void main(String[] args) {//计算两个日期间隔多少天,计算间隔多少年,多少月LocalDate date1 = LocalDate.parse("2024-07-12");LocalDate date2 = LocalDate.parse("2024-09-11");Period period =Period.between(date1,date2);System.out.println("date1到date2相间隔"+period.getYears()+"年"+period.getMonths()+"月"+period.getDays()+"天");long day = date2.toEpochDay() - date1.toEpochDay();System.out.println(date2+"和"+date1+"相差"+day+"天");}

4. 获取指定日期

    public static void main(String[] args) {LocalDate today = LocalDate.now();//获取当前月第一天LocalDate firstDayOfThisMonth = today.with(TemporalAdjusters.firstDayOfMonth());System.out.println("当前月第一天:"+firstDayOfThisMonth);//获取本月最后一天LocalDate lastDayOfThisMonth = today.with(TemporalAdjusters.lastDayOfMonth());System.out.println("当前月最后一天:"+lastDayOfThisMonth);// 获取下一天LocalDate nextDay = lastDayOfThisMonth.plusDays(1);System.out.println("下一天(次月第一天):"+nextDay);LocalDate nextDay2 = today.plusDays(1);System.out.println("当前下一天:"+nextDay2);//获取当年最后一天LocalDate lastday = today.with(TemporalAdjusters.lastDayOfYear());System.out.println("当年最后一天:"+lastday);//获取当年最后一个周LocalDate lastMondayOfThisYear = lastday.with(TemporalAdjusters.lastInMonth(DayOfWeek.MONDAY));System.out.println("当年最后一个周一:"+lastMondayOfThisYear);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1542298.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

ES学习笔记

目录 简介 原理 基础概念 lucene总结 es的进步 实现过程 写入流程 搜索过程 和Mysql搭配 学习来源&#xff1a;https://i12pc3nf6d.feishu.cn/wiki/FnPwwGXGli1ANGkaMz5chvhmn2e#share-OYKJdYhehotnMgxrBiUcZSJJnCb https://i12pc3nf6d.feishu.cn/wiki/FnPwwGXGli1ANG…

【Linux】【Hadoop】大数据基础实验一

实验一&#xff1a;熟悉常用的Linux操作和Hadoop操作 一、实验目的 Hadoop运行在Linux系统上&#xff0c;因此&#xff0c;需要学习实践一些常用的Linux命令。本实验旨在熟悉常用的Linux操作和Hadoop操作&#xff0c;为顺利开展后续其他实验奠定基础。 二、实验平台 操作系统…

comp 9517 Computer Vision week2

图像处理 1.空间域操作(Spatial domain operation)1.1 点(Point operation)1.2 邻域(Neighbourhood operation)空间滤波(spatial filtering)修复边界问题(fixing the border problem)通过卷积进行空间滤波(Spatial filtering by convolution)卷积特性&#xff1a;滤波器强度梯度…

Java 缓存机制与缓存失效

在分布式系统中&#xff0c;缓存 是提高系统性能、减轻数据库压力的常用技术。合理的缓存策略不仅能提升响应速度&#xff0c;还能节省资源。不过&#xff0c;缓存并不是万能的&#xff0c;缓存失效 是开发中必须考虑的问题。如果处理不好&#xff0c;可能会导致数据不一致或性…

使用库函数点亮一个LED灯

软件设计 STM32Gpio的介绍 如果想让LED0点亮&#xff0c;那么R12就要是高电平&#xff0c;LED0就要是低电平&#xff0c;也就是PF9就是低电平 F407系统主频要工作在168MHZ F103的话是工作在72mhz F429的话就180MHZ 接着我们就要使能Gpio的时钟&#xff0c;使能之后对GPIO相关…

YOLOV8输出预测框的坐标信息

结果&#xff1a;&#xff08;前提是对应类别的yolov8模型已经训练好&#xff09; 具体实现&#xff1a; 在ultralytics\utils\plotting.py里面 CtrlF搜索box_label 再次照片的最后一行输入&#xff1a; # 左上角cv2.putText(self.im, f"({p1[0]}, {p1[1]})", (p1…

19.初始C语言指针

初始C语言指针 1.指针的认识2.指针变量的引入3.指针变量的类型4.指针的应用场景15.指针的应用场景26.作业 1.指针的认识 指针 地址 //int a 10; //类型 变量名 内存地址 值 1.变量名直接访问2.通过地址访问&&#xff1a;取地址运算符* &#xff1a;将地址内的值读取…

Nacos未授权下载配置信息

0x01 漏洞描述&#xff1a; Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos存在未授权文件下载&#xff0c;攻击者在不登录情况下可未授权下载系统配置文件。 攻击者利用该漏洞可未授权获取到系统配置文件&#xff0c;如数据库和Redis连接地址…

【Delphi】创建应用程序和 LiveBindings示例(FMX)

一、创建一个FMX程序 界面上放置上如下3个控件&#xff1a;TProgressBar1, TArcDial1,TTrackBar1。 二、打开LiveBindings Designer 设计器 三、在 LiveBindings Designer 中&#xff0c;您的绑定图只包含对象&#xff0c;您可以将它们连接起来。 四、在设计器中&#xff0c;在…

openFrameworks_如何使用ofxXmlSettings和ofxGui来创建识别界面

效果图&#xff1a; 代码及详解 1.添加两个插件的头文件: #include "ofxGui.h" #include "ofxXmlSettings/src/ofxXmlSettings.h" 2.添加GUI部分&#xff0c;然后在.h声明右边的openframeworks的UI部分&#xff0c;包括面板ofxPanel&#xff0c;按钮ofx…

Tomcat 漏洞复现

1、CVE-2017-12615 1、环境开启 2、首页抓包&#xff0c;修改为 PUT 方式提交 Tomcat允许适用put方法上传任意文件类型&#xff0c;但不允许isp后缀文件上传&#xff0c;因此需要配合 windows的解析漏洞 3、访问上传的jsp文件 4、使用工具进行连接 2、后台弱⼝令部署war包 1…

简单了解一下SurfaceView

0 背景 最近好几次面试被问到SurfaceView的特点了&#xff0c;都没回答出来。 SurfaceView和TextureView也是Compose这样的声明式ui唯二实现不了控件&#xff1b;因为他们就不是View&#xff0c;而是Android提供的和Surface相关的显示系统 。 特此简单了解一下。 1 应用场景…

【Godot4.3】点数据简易表示法和Point2D

概述 在构造多点路径时我们会用到PackedVector2Array&#xff0c;并使用Vector2()来构造点。在手动创建多点数据时&#xff0c;这种写法其实很难看&#xff0c;有大量重复的Vector2()&#xff0c;比如下面这样&#xff1a; var points [Vector2(100,100),Vector2(200,200),V…

[Python]二、Python基础数据科学库(1)

F:\BaiduNetdiskDownload\2023人工智能开发学习路线图\2、机器学习核心技术\1、零基础快速入门机器学习 1.机器学习概述 1.1 人工智能概述 1.1.1 人工智能与机器学习、深度学习 1956年-达特茅斯会议-人工智能的起点 人工智能和机器学习、深度学习的关系: 1. 机器学习…

软考(9.22)

1 在浏览器的地址栏中输入xxxyftp.abc.can.cn&#xff0c;在该URL中( )是要访问的主机名。 A.xxxyftp B.abc C.can D.cn 协议://主机名.域名.域名后缀或IP地址(:端口号)/目录/文件名。 本题xxxyftp是主机名&#xff0c;选择A选项。 2 假设磁盘块与缓冲区大小相同&#xff0c;…

Django基础-创建新项目,各文件作用

学习Django的前置知识&#xff1a; python基本语法&#xff1a;需要掌握Python中的变量、循环、条件判断、函数等基本概念。面向对象编程&#xff08;OOP&#xff09;&#xff1a;Django的核心架构基于面向对象编程&#xff0c;许多功能&#xff08;如模型和视图&#xff09;依…

【无人机设计与控制】 基于matlab的蚁群算法优化无人机uav巡检

摘要 本文使用蚁群算法&#xff08;ACO&#xff09;优化无人机&#xff08;UAV&#xff09;巡检路径。无人机巡检任务要求高效覆盖特定区域&#xff0c;以最小化能源消耗和时间。本研究提出的算法通过仿生蚁群算法优化巡检路径&#xff0c;在全局搜索和局部搜索中平衡探索与开…

文档布局内容检测系统源码分享

文档布局内容检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

银河麒麟高级服务器操作系统V10外接硬盘挂载指南

银河麒麟高级服务器操作系统V10外接硬盘挂载指南 1、临时挂载外接硬盘2、永久挂载外接硬盘3、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在使用银河麒麟高级服务器操作系统V10时&#xff0c;您可能希望将外接硬盘&#xff08;如sd…

django应用JWT(JSON Web Token)实战

文章目录 一、什么是JWT二、为什么使用JWT三、在django项目中如何应用JWT1、安装djangorestframework-simplejwt库&#xff1a;2、在settings.py中配置JWT认证&#xff1a;3、在urls.py中配置JWT的获取和刷新路由&#xff1a; 四、JWT如何使用1、调用生成JWT的接口获取JWT2、客…