首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >聊下那些我知道的Jdk8的骚操作

聊下那些我知道的Jdk8的骚操作

作者头像
东边的大西瓜
发布于 2022-05-05 03:31:17
发布于 2022-05-05 03:31:17
30600
代码可运行
举报
文章被收录于专栏:吃着西瓜学Java吃着西瓜学Java
运行总次数:0
代码可运行

JDK8的那些骚操作

不是吧啊sir,这都JDK14.0.2了你还在这讲JDK8?!!!

1.静态方法和默认方法

在JDK8中,允许在接口中增加静态方法和默认方法。理论上讲,没有什么不妥,只不过这种做法确实有违将接口作为抽象规范的初衷。

先让我们来回忆一下接口的概念:接口不是类,而是对类的一组需求描述,这些类要遵从接口描述的统一格式进行定,一个类可以实现一个或多个接口。可以将接口看成是没有实例域的抽象类。接口中可以定义变量和方法,接口中可以包含方法和常量,方法和常量的修饰符是:public abstract和public static final,这两个修饰符是默认的,也就是说我们不需要去主动添加。

JDK8之前定义接口的写法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface Student {
  //定义常量
  String name = "西瓜籽";
  public static final String aliasName="黑籽";
  int age = 18;
  //定义方法
  void playing();
  public abstract void learning();
}

JDK8之后可以这样写:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface Students {
  //定义常量
  String name = "西瓜籽";
  public static final String aliasName="黑籽";
  int age = 18;
  //静态方法
  static void playing(){
  System.out.println("在看大西瓜的推文");
  }
    //默认方法
  default void learning(){
  System.out.println("在和大西瓜一起学Java");
  }
} 

我们实现该接口:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ImpStudent implements Students {
  @Override
  public void learning() {
  System.out.println("在教大西瓜学Java");
 }
}

我们发现default方法是可以重写的,而static方法不能重写。在IDEA的工具中也可以发现可实现的方法也只有default关键字修饰的learning()方法。

2.Lambda表达式和接口式函数

lambda表达式是继泛型后,引入的另一让人眼前一亮的特性。lambda表达式是一个可传递的代码块,可以在以后执行一次或多次。

lambda表达式形式:

(参数) -{表达式} 注意:参数可以为空,参数的类型无需指定,lambda根据上下文自动获取;表达式是要实现的内容,但是单个返回值可以不用{}

接口式函数:

对于只有一个抽象方法的接口,需要这种接口的对象时,就可以提供一个lambda表达式。这种接口称为函数式接口。函数式接口带有@FunctionalInterface的标注。

西瓜籽:“ 为什么接口式函数必须要有一个抽象方法?”

大西瓜:“ 因为接口完全有可能重新声明Object类的方法,如toString()和clone(),这些声明有可能会让方法不再是抽象的。更重要的是我们前面小结说讲的现在接口中已经可以存在‘静态方法和默认方法’ ”。

下面我们用Arrays.sort()方法,来展示一下lambda表达式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void main(String[] args) {
    Integer[] a = {2,1,4,3,5};
    Integer[] b = {2,1,4,3,5};
    //传统写法,需定义一个实现了Compartor<T>接口的DESCComparator<T>类
    Arrays.sort(b,new DESCComparator());
    for (int i : b){
        System.out.print(i+" ");
    }
    System.out.println();
    //Lambda写法,无需指定就i,j类型,将自动化为Integer类型
    Arrays.sort(a,(i,j)->j-i);
    for (int i : a){
        System.out.print(i+" ");
    }
}
//传统写法的内部类
static class DESCComparator implements Comparator<Integer>{

    @Override
    public int compare(Integer A, Integer B) {
        return B-A;
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 运行结果:
 5 4 3 2 1

 5 4 3 2 1

Lambda表达式作用域:

lambda表达式访问外层作用域和匿名对象的方式很相似。可以直接访问标记了final的外层局部变量、实例的字段以及静态全局变量。不过这里并不建议大家使用后俩,有一条规则:“lambda表达式中捕获的变量必须是实际上的最终变量(final的)”,这样也可以保证并发执行时的安全。在Java中,lambda表达式就是闭包。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Scope {
//自定义一个接口式函数
static interface MySystem{
    void print();
}

//Error:(10, 52) java: 无法从静态上下文中
//Integer A=10;引用非静态 变量 A

public static Integer A=10;

public static void main(String[] args) {
    //对于lambda而言,默认为final类型
    Integer a=10;
    MySystem mySystem =()-> System.out.println(a);
    mySystem.print();
   }
 }

总结:

lambda表达式可以使我们的代码更加简洁,可是同时也使得代码得可读性变差。而且我们最好把lambda表达式看作是一个函数,而不是一个对象,另外要接受lambda表达式可以传递到函数式接口。实际上在Java中,对lambda表达式所能做的也只是能转换为函数式接口。甚至不能把lambda表达式赋给类型为Object的变量,因为Object不是一个函数式接口。


3.方法引用和构造器引用

方法引用:

有时,可能已经有现成的方法可以完成你想要传递到其他代码的某个动作。就拿我们上面引入lambda表达式时的排序代码来进行对比讲解,之前我们是这样写的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Arrays.sort(a,(i,j)->j-i)

上述代码刨根问底到源码也就是都使用了compare方法来进行比较的,恰巧我们的Interger类里面有现成的compare方法,所以我们这时候就可以这样写了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Arrays.sort(a,Integer::compareTo);
从上面可以看出方法引用的操作符为"::",用来分隔方法名与对象或类名。主要有三种情况:

object::instanceMethod

Class::staticMethod

Class::instanceMethod

构造器引用:

构造器引用与方法引用很类似,只不过方法名为new,我们可以像其他方法引用一样创建构造函数的方法引用。需要注意的是,需要调用的构造器参数列表要和函数式接口中抽象方法的参数列表保持一致。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//lambda表达式写法
Supplier<Student> studentSupplier1 = ()->new Student();
//构造器写法
Supplier<Student> studentSupplier2 = Student::new;

4.JDK8 新增的日期时间API

在JDK8之前,处理日期时间,我们主要使用3个类, Date、 SimpleDateFormat 和 Calendar。不过要注意的是SimpleDateFormat不是线程安全的,Data和Calendar的月份是0~11,让人使用起来多少感觉有些不舒服。在JDK8推出了全新的日期时间处理类,有效的解决了上述问题。下面我们就来讨论一下这些新增类:

LocalDate:只有日期

LocalTime:只有时间

LocalDateTime:有时间和日期

Instat:时间戳

DateTimeFormatter:日期格式化

LocalDate:

LocalDate封装了实例域来维护所设置的日期。如果不查看源代码,就不可能知道类内部的日期表示。当然,封装的意义在于,这一点并不重要,重要的是类对外提供的方法。LocalDate类没有更改器方法,与之不同,Date类有一个更改器方法setTime,可以在这里设置毫秒数。Date对象是可变的,这一点就破坏了封装性!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Test
public  void  LocalDateTest(){
  //获取当前日期
  LocalDate localDate = LocalDate.now();
  //年
  int year = localDate.getYear();
  //月
  int mouth = localDate.getMonthValue();
  //日
  int day = localDate.getDayOfMonth();
  //获取指定日期
  LocalDate AppointDate = LocalDate.of(2020,9,9);
  System.out.println(localDate);
  System.out.println("year:"+year);
  System.out.println("mouth:"+mouth);
  System.out.println("day:"+day);
  System.out.println("指定日期:"+AppointDate);
}

LocalTime

封装性

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Test
public void LocalTimeTest(){
    //获取当前时间
    LocalTime localTime = LocalTime.now();
    //小时
    int hour = localTime.getHour();
    //分钟
    int minute = localTime.getMinute();
    //秒
    double second = localTime.getSecond();
    System.out.println("当前时间:"+localTime);
    System.out.println("小时:"+hour);
    System.out.println("分钟:"+minute);
    System.out.println("秒:"+second);
}

LocalDateTime

上两个的合体版

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Test
public void LocalDateTimeTest(){
    LocalDateTime localDateTime = LocalDateTime.now();
    System.out.println(localDateTime);
}

Instant:

在JDK8中Instant可以替代Date。时间上的瞬时点,这个类对时间线上的一个瞬时点进行建模。可以用作时间戳。推荐用Instant类代替Date类。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Test
  public void Instant(){
      //获取当前时间
      Instant instant = Instant.now();
      System.out.println(instant);
      //获取时间戳,单位为秒
      System.out.println(instant.getEpochSecond());
      //获得时间戳,单位为毫秒
      System.out.println(instant.toEpochMilli());
}

DateTimeFormatter:

JDK8新增用DateTimeFormatter来处理日期格式化问题,阿里也建议使用DateTimeFormatter来代替SimpleDateFormat。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Test
public void DateTimeFormatter(){
    LocalDate localDate = LocalDate.now();
    System.out.println("yyyy/MM/dd:"+localDate.format(DateTimeFormatter.ofPattern("yyyy/MM/dd")));
}

总结:将时间和日历分开是一种很好的面向对象设计。通常,最好使用不同的类表示不同的概念。不要使用构造器来构造LocalDate这些类的对象。

还有些我不太熟悉,等我熟悉了咱再聊

- END -

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 吃着西瓜学Java 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
shapely.geometry.polygon 实现任意两个四边形的IOU计算
来源为华中科技大学白翔老师。import numpy as np import shapelyfrom shapely.geometry import Polygon,MultiPoint #多边形 line1=[2,0,2,2,0,0,0,2] #四边形四个点坐标的一维数组表示,[x,y,x,y....]a=np.array(line1).reshape(4, 2) #四边形二维坐标表示poly1 = Polygon(a).convex_hull #python四边形对象,会自动计算四个点,最
狼啸风云
2021/05/10
2K0
[1025]python地理处理包shapely
github:https://github.com/Toblerity/Shapely
周小董
2021/07/20
4.8K0
[1025]python地理处理包shapely
(数据科学学习手札74)基于geopandas的空间数据分析——数据结构篇
geopandas是建立在GEOS、GDAL、PROJ等开源地理空间计算相关框架之上的,类似pandas语法风格的空间数据分析Python库,其目标是尽可能地简化Python中的地理空间数据处理,减少对Arcgis、PostGIS等工具的依赖,使得处理地理空间数据变得更加高效简洁,打造纯Python式的空间数据处理工作流。本系列文章就将围绕geopandas及其使用过程中涉及到的其他包进行系统性的介绍说明,每一篇将尽可能全面具体地介绍geopandas对应方面的知识,计划涵盖geopandas的数据结构、投影坐标系管理、文件IO、基础地图制作、集合操作、空间连接与聚合。   作为基于geopandas的空间数据分析系列文章的第一篇,通过本文你将会学习到geopandas中的数据结构。 geopandas的安装和使用需要若干依赖包,如果不事先妥善安装好这些依赖包而直接使用pip install geopandas或conda install geopandas可能会引发依赖包相关错误导致安装失败,官方文档中的推荐安装方式为:
Feffery
2020/02/15
3K0
模拟量差分和单端(iou计算方法)
人工修正后的每一个框与算法输出的所有框去计算IOU,取出IOU大于0.9的算法输出框
全栈程序员站长
2022/07/31
5980
模拟量差分和单端(iou计算方法)
30分钟学会shapely空间几何分析
shapely是python中开源的空间几何对象库,支持Point(点),LineString(线), Polygon(面)等几何对象及相关空间操作。
lyhue1991
2021/03/17
4.5K0
30分钟学会shapely空间几何分析
讲解python多边形裁剪
在计算机图形学中,多边形裁剪是一个常用的技术,用于确定多边形与给定裁剪窗口之间的交集。通过裁剪,我们可以剔除不在裁剪窗口范围内的部分,从而减少图形处理的计算量,并加速渲染过程。 Python提供了各种库和算法来实现多边形裁剪。在本篇文章中,我们将使用shapely库来进行多边形的裁剪操作。shapely是一个Python库,提供了一些用于处理几何图形数据的功能。
大盘鸡拌面
2023/12/26
6360
(数据科学学习手札84)基于geopandas的空间数据分析——空间计算篇(上)
  在本系列之前的文章中我们主要讨论了geopandas及其相关库在数据可视化方面的应用,各个案例涉及的数据预处理过程也仅仅涉及到基础的矢量数据处理。在实际的空间数据分析过程中,数据可视化只是对最终分析结果的发布与展示,在此之前,根据实际任务的不同,需要衔接很多较为进阶的空间操作,本文就将对geopandas中的部分空间计算进行介绍。
Feffery
2020/05/25
4.2K0
(数据科学学习手札84)基于geopandas的空间数据分析——空间计算篇(上)
geopandas 0.14版本重要更新内容一览
大家好我是费老师,就在前两天,Python生态中的GIS运算神器geopandas发布了其0.14.0新版本,在这次新版本更新中,不仅是新增了许多矢量计算API,还开始为日后正式发布1.0版本做准备,对一些底层依赖版本进行改动。今天的文章中,我就将为大家一一介绍相关的更新内容:
派大星的数据屋
2023/09/18
4090
geopandas 0.14版本重要更新内容一览
(数据科学学习手札154)geopandas 0.14版本新特性一览
  大家好我是费老师,就在前两天,Python生态中的GIS运算神器geopandas发布了其0.14.0新版本,在这次新版本更新中,不仅是新增了许多矢量计算API,还开始为日后正式发布1.0版本做准备,对一些底层依赖版本进行改动。今天的文章中,我就将为大家一一介绍相关的更新内容:
Feffery
2023/09/18
4490
(数据科学学习手札154)geopandas 0.14版本新特性一览
Part3-1.获取高质量的阿姆斯特丹建筑立面图像(附完整代码)
本文为《通过深度学习了解建筑年代和风格》论文复现的第三部分——获取阿姆斯特丹高质量街景图像的上篇,主要讲了如何获取利用谷歌街景地图自动化获取用于深度学习的阿姆斯特丹的高质量街景图像,此数据集将用于进行建筑年代的模型训练[1]。
renhai
2023/11/24
9660
Part3-1.获取高质量的阿姆斯特丹建筑立面图像(附完整代码)
geopandas:Python绘制数据地图
GeoPandas是一个Python开源项目,旨在提供丰富而简单的地理空间数据处理接口。 GeoPandas扩展了Pandas的数据类型,并使用matplotlib进行绘图。GeoPandas官方仓库地址为:GeoPandas。 GeoPandas的官方文档地址为:GeoPandas-doc。 本文主要参考GeoPandas Examples Gallery。 GeoPandas的基础使用见Python绘制数据地图1-GeoPandas入门指北。 GeoPandas的可视化入门见Python绘制数据地图2-GeoPandas地图可视化。
luckpunk
2023/09/14
4.1K0
geopandas:Python绘制数据地图
(在模仿中精进数据可视化06)常见抽象地图的制作方法
  我们经常会在一些PPT报告或者宣传广告中看到一些比较抽象的地图,它们都是在正常地图的基础上,通过置换几何元素,来实现出较为抽象的效果,这类的作品非常之多,因此本文不模仿实际的某幅作品,而是制作出下面三类抽象地图:
Feffery
2021/01/05
9750
(在模仿中精进数据可视化06)常见抽象地图的制作方法
Google Earth Engine(GEE)——点线面运算及其交集并集等
Earth Engine 支持对Geometry对象的各种操作。这些包括对单个几何图形的操作,例如计算缓冲区、质心、边界框、周长等。例如:
此星光明
2024/02/02
3260
Google Earth Engine(GEE)——点线面运算及其交集并集等
一个R语言中操纵矢量空间数据的标准化工具—sf
摘要 Simple features是一种在计算机中编码矢量空间数据(点、线、面等)的标准化方法。sf包在R语言中引入了simple features对象,它基本具备和sp、rgeos、rgdal一样的矢量空间数据处理能力。本文主要描述此包的基本功能,其在R语言诸多扩展生态系统中的地位,以及在连接R语言与其他空间计算系统中的潜在价值。
数据小磨坊
2019/09/17
4.6K0
一个R语言中操纵矢量空间数据的标准化工具—sf
六、处理几何数据【ArcGIS Python系列】
要素类中的每个要素都由一个或多个顶点组成,这些顶点定义了点、多段线或多边形要素。在点要素类的情况下,每个点要素由单个顶点组成。多段线和多边形要素由多个顶点组成。每个顶点是由一对x、y坐标定义的位置。该图说明了点、多段线和多边形如何在笛卡尔坐标空间中由顶点定义。
renhai
2023/11/24
5850
六、处理几何数据【ArcGIS Python系列】
(数据科学学习手札147)Python GIS利器shapely全新2.0版本一览
  大家好我是费老师,我写过很多篇介绍geopandas相关技术的文章,而geopandas之所以如此高效易用,成为Python GIS生态中的翘楚,离不开其底层依赖库shapely对其矢量计算功能的支持。
Feffery
2022/12/18
9870
(数据科学学习手札147)Python GIS利器shapely全新2.0版本一览
GEE训练教程——如何确定几何形状的中心点坐标和相交的坐标
在GEE中,可以使用.geometry()方法来获取几何形状的中心点坐标和相交的坐标。
此星光明
2024/06/11
3080
GEE训练教程——如何确定几何形状的中心点坐标和相交的坐标
GIS拓扑讲解点线面几何体的拓扑关系判断及运算分析_turf案例
Turf.js是JavaScript  空间分析库,由Mapbox 提供,Turf 实现了
周陆军博客
2023/04/09
2.8K0
spatial4j入门实战
Spatial4j是一款java编写的空间计算开源库,支持ASL开源协议,支持地理空间计算。
doaction
2021/11/18
3.2K0
POSTGIS 总结
PostGIS是一个空间数据库,空间数据库像存储和操作数据库中其他任何对象一样去存储和操作空间对象。
小石头
2022/11/10
6.9K0
POSTGIS 总结
推荐阅读
相关推荐
shapely.geometry.polygon 实现任意两个四边形的IOU计算
更多 >
目录
  • JDK8的那些骚操作
    • 不是吧啊sir,这都JDK14.0.2了你还在这讲JDK8?!!!
    • 1.静态方法和默认方法
    • 2.Lambda表达式和接口式函数
      • 总结:
    • 3.方法引用和构造器引用
      • 方法引用:
      • 构造器引用:
    • 4.JDK8 新增的日期时间API
      • LocalDate:
      • LocalTime
      • LocalDateTime
      • Instant:
      • DateTimeFormatter:
    • 还有些我不太熟悉,等我熟悉了咱再聊
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档