java8新特性——23.12.10-12.12

50 阅读7分钟

1.鼠标左键+ctrl:点进去具体的jar包之类的 2.全局配置settings文件:关闭所有project,点击左侧Costumes——>Configure,

image.png 3.pom文件里面的: <dependencyManagement></dependencyManagement>语句的作用是,在父pom文件里只管理版本,不会下载具体jar包(假如父pom文件不加这个标签,所有子模块都可以引用这个jar包,不能够按需引用;有了这个标签,父pom文件只管理这个版本不会去下载,子模块如果想要使用,再去引入的时候,直接就会提示“你应该去下载的版本是你父pom文件里面提出的,不要胡乱下载”。达到了版本管理的作用。) 比如下图:当你想在子模块里引用fastjson,你不需要输入版本号,仅输入artifactId,左边就会自动出现蓝色圈圈按钮,让你去继承父pom文件里面已经管理的版本号。 也就是说<dependencyManagement></dependencyManagement>要在最外层的pom文件中去定义! image.png 4.按钮可以出现module之间的jar包依赖视图,以便更好的解决依赖版本冲突等问题。

image.png IDEA有时可以自动帮助我们解决冲突(一些原则:比如写在上面的版本被引用),有时需要插件解决:maven-help(安装完成后需要重启IDEA)

image.png 重启后,底部会出现依赖分析器,帮助分析冲突:

image.png 点击之后,会出现冲突,看到红色的,右键,Exclude即可

image.png fastison是阿里巴巴的开源SON解析库,它可以解析ISON格式的字符串,支持将Java Bean序列化为]SON字符串,也可以从SON字符串反序列化到avaBean。

fastjson的优点

速度快

fastison相对其他]SON库的特点是快,从2011年fastison发布1.1x版本之后,其性能从未被其他/ava实现的]SON库超越。

使用广泛

fastjson在阿里巴巴大规模使用,在数万台服务器上部署,fastison在业界被广泛接受。在2012年被开源中国评选为最受欢迎的国产开源软件之一。

测试完备

fastjson有非常多的testcase,在1.2.11版本中,testcase超过3321个。每次发布都会进行回归测试,保证质量稳定。

使用简单

fastjson的API十分简洁

网址: Java集合常见面试题总结(上) | JavaGuide(Java面试 + 学习指南)

docs/谷粒商城—分布式基础.md · liurui/gulimall01 - Gitee.com JAVA规划

冒死上传!这可能是最好的软考系统架构设计师教程精讲视频!含习题||有讲义||教材讲解||通过上岸||免费分享,拿走不谢!_哔哩哔哩_bilibili

教会徒弟饿死师傅系列,讲清楚大论文如何无中生有_哔哩哔哩_bilibili

PriorityQueue实现堆排序、求第 K 大的数 “n|=n>>>1”("|="是或运算,>>>1是无符号右移1位,等价于/2;) TreeMap、TreeSet 以及 JDK1.8 之后的 HashMap 底层都用到了红黑树。红黑树就是为了解决二叉查找树的缺陷,因为二叉查找树在某些情况下会退化成一个线性结构。

12.11日

1.lambda表达式:将代码像数据一样传递。

lambda表达式的本质:作为接口的实例(还没明白) "->"就叫lambda操作符/箭头操作符,多么形象! lambda操作符左侧的(),里面是形参列表,右边是lambda体(抽象方法类体)

lambda表达式就是函数式接口的实例!!! 函数式接口:如果一个接口中,只声明了一个抽象方法,则此接口就称为函数式接口。函数时接口只能有一个抽象方法(因为要用lambda表达式写的时候不显示定义方法,如果有多个抽象方法就必须实现不了隐式定义了)

@FunctionalInterface有这个标注的就是函数式接口

java中四大函数式接口:

  1. 消费型函数式接口(有参,无返回值)
  2. 供给型函数式接口(无参,有返回值)
  3. 断言型函数式接口(有参,返回值是bool型)
  4. 函数型函数式接口(有参有返回值)

其他接口:(看到这种函数,就是可以用lambda表达式) image.png

2.见到这个“::”符号,就是方法引用。
  • 1.使用情境:当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!
  • 2.方法引用,本质上就是Lambda表达式,而ambda表达式作为函数式接口的实例。所以方法引用,也是函数式接口的笑例。
  • 3,使用格式:类(或对象) :: 方法名
  • 4 .具体分为如下的三种情况
  1. 对象 :: 非静态方法
  2. 类 ::静态方法
  3. 类 :: 非静态方法
  • 5,方法引用使用的要求:要求接口中的抽象方法的形参列表和返回值类型与方法引用的方法的形参列表和返回值类型相同!
3.构造器引用/数组引用

和方法引用相似,看例子(lambda)

(第二部分)Stream API

使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 StreamAPI来并行执行操作。简言之,Stream API提供了一种高效且易于使用的处理数据的方式。

  • Collection集合和Stream API有什么关系和区别? “集合讲的是数据,stream讲的是计算!”
  1. stream自己不会存储元素
  2. stream 不会改变源对象。相反,他们会返回一个持有结果的新Stream
  3. Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。
stream的操作三个步骤
  • 1- 创建 Stream :一个数据源(如:集合、数组),获取一个流
  • 2 中间操作:一个中间操作链,对数据源的数据进行处理
  • 3-终止操作(终端操作):一旦执行终止操作,就执行中间操作链,并产生结果。之后,不会再被使用

一、创建STream API(四种方式)

1.通过集合
2.通过数组

Java8 中的Arrays 的静态方法 stream0可以获取数组流:

static Stream stream(TI] array): 返回一个流

重载形式,能够处理对应基本类型的数组:

  • public static IntStream stream(int[] array)
  • public static LongStream stream(long[] array)
  • public static DoubleStream stream(double[] array)
3.通过Stream的of()

可以调用Stream类静态方法 of()通过显示值创建一个流。它可以接收任意数量的参数。 public static<T> Stream<T> of(T... values) : 返回一个流

4.创建无限流

可以使用静态方法 Stream.iterate()和 Stream.generate()创建无限流。

迭代:public static<T> Stream<T> iterate(final T seed, final UnaryOperator<T> f)

生成:public static<T> Stream<T> generate(Supplier<T> s)

二、Stream API的中间操作

多个中间操作可以连接起来形成一个流水线,除非流水线上触发终止操作,否则中间操作不会执行任何的处理! 而在终止操作时一次性全部处理,称为“惰性求值”。

1.筛选与切片:

image.png

2.映射:

image.png

3. 排序

image.png

二、Stream API的终止操作

终端操作会从流的流水线生成结果。其结果可以是任何不是流的值,例如: List、Integer,甚至是 void 。流进行了终止操作后,不能再次使用。

1.匹配与查找

image.png 还有count(),min(),max(),forEach(),等等

2.规约

image.png

3.收集

image.png

image.png

第三部分 Optiona类

  • 到目前为止,臭名昭著的空指针异常是导致Java应用程序失败的最常见原因。 以前,为了解决空指针异常,Boogle公司著名的Guava项目引入了Optional类, Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代 码。受到Google Guava的启发,Optional类已经成为Java 8类库的一部分。
  • Optional类(java.util.Optional) 是一个容器类,它可以保存类型T的值,代表 这个值存在。或者仅仅保存null,表示这个值不存在。原来用null 表示一个值不 存在,现在Optional可以更好的表达这个概念。并且可以避免空指针异常。 Optional类的Javadoc描述如下:这是一个可以为null的容器对象。如果值存在 则isPresent()方法会返回true,调用get()方法会返回该对象。
1.OPtional类所提供的方法:

image.png