java基础知识二

Java基础知识二

Java基础知识一
Java基础知识二



前言

记录java不同版本新增的一些内容知识点


一.Jdk1.8新特性

·Interface

interface 的设计初衷是面向抽象,提高扩展性。这也留有一点遗憾,Interface 修改的时候,实现它的类也必须跟着改。为了解决接口的修改与现有的实现不兼容的问题。新 interface 的方法可以用default 或 static修饰,这样就可以有方法体,实现类也不必重写此方法。一个 interface 中可以有多个方法被它们修饰,这 2 个修饰符的区别主要也是普通方法和静态方法的区别。
default修饰的方法,是普通实例方法,可以用this调用,可以被子类继承、重写。
static修饰的方法,使用上和一般类静态方法一样。但它不能被子类继承,只能用Interface调用。

·functional interface 函数式接口

也称 SAM 接口,即 Single Abstract Method interfaces,有且只有一个抽象方法,但可以有多个非抽象方法的接口。

·Lambda 表达式

是继泛型(Generics)和注解(Annotation)以来最大的变化。使用 Lambda 表达式可以使代码变的更加简洁紧凑。让 java 也能支持简单的函数式编程。语法格式:

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

·替代匿名内部类
过去给方法传动态参数的唯一方法是使用内部类。
现在我们发现这些匿名内部类只重写了接口的一个方法,当然也只有一个方法须要重写。这就是我们上文提到的函数式接口,也就是说只要方法的参数是函数式接口都可以用 Lambda 表达式。
集合迭代的改进:

void lamndaFor() {
        List<String> strings = Arrays.asList("1", "2", "3");
        //传统foreach
        for (String s : strings) {
            System.out.println(s);
        }
        //Lambda foreach
        strings.forEach((s) -> System.out.println(s));
        //or
        strings.forEach(System.out::println);
     //map
        Map<Integer, String> map = new HashMap<>();
        map.forEach((k,v)->System.out.println(v));
}

·方法的引用

Java 8 允许使用 :: 关键字来传递方法或者构造函数引用,无论如何,表达式返回的类型必须是 functional-interface。
·lambda 表达式可以引用外边变量,但是该变量默认拥有 final 属性,不能被修改,如果修改,编译时就报错。
方法引用操作符有【四种类型】:

ClassName :: New  :对构造函数的引用,相当于创建对象;
ClassName :: static_method :如果有参数会把参数当方法的实参;
ClassName :: instance_method :把第一个参数当做类对象,用来调用 instance_method,其他参数当做方法的参数;
instance :: instance_method :如果有参数会把参数当方法的实参;

·没有去手动实例化一个类,而是采用了“new 接口名“这种方式直接定义了一个匿名类对象,然后将它作为参数传递个函数。
· 内部类是指在一个类的内部定义的类。它与普通的类不同,它可以直接访问外部类的成员,包括私有成员,而且还可以使用外部类的引用。内部类提供了一种更加灵活的封装方式,有助于组织复杂的代码结构。

·Stream

Stream 是Java8中处理集合的关键抽象概念,它可以对集合进行非常复杂的查找、过滤、筛选等操作。依然不存储数据,不同的是它可以检索(Retrieve)和逻辑处理集合数据、包括筛选、排序、统计、计数等。可以想象成是 Sql 语句。它的源数据可以是 Collection、Array 等。由于它的方法参数都是函数式接口类型,所以一般和 Lambda 配合使用。
流类型
1)stream 串行流
2)parallelStream 并行流,可多线程执行
·延迟执行
在执行返回 Stream 的方法时,并不立刻执行,而是等返回一个非 Stream 的方法后才执行。因为拿到 Stream 并不能直接用,而是需要处理成一个常规类型。这里的 Stream 可以想象成是二进制流。
·从源码和实例中我们可以总结出一些 stream 的特点
·通过简单的链式编程,使得它可以方便地对遍历处理后的数据进行再处理。
·方法参数都是函数式接口类型
·一个 Stream 只能操作一次,操作完就关闭了,继续使用这个 stream 会报错。
·Stream 不保存数据,不改变数据源

·Optional

建议使用 Optional 解决 NPE(java.lang.NullPointerException)问题,它就是为 NPE 而生的,其中可以包含空值或非空值。

·Date-Time API

这是对java.util.Date强有力的补充,解决了 Date 类的大部分痛点:
非线程安全
时区处理麻烦
各种格式化、和时间计算繁琐
设计有缺陷,Date 类同时包含日期和时间;还有一个 java.sql.Date,容易混淆。

·字符串转日期格式

java.util.Date 既包含日期又包含时间,而 java.time 把它们进行了分离。
Java 8 之前 转换都需要借助 SimpleDateFormat 类,而Java 8 之后只需要 LocalDate、LocalTime、LocalDateTime的 of 或 parse 方法。

·日期计算

Period period = Period.between(date1, date2);
·JDBC 和 java8
现在 jdbc 时间类型和 java8 时间类型对应关系是
Date —> LocalDate
Time —> LocalTime
Timestamp —> LocalDateTime
而之前统统对应 Date,也只有 Date。

·时区

java.util.Date 本身并不支持国际化,需要借助 TimeZone。在新特性中引入了 java.time.ZonedDateTime 来表示带时区的时间。它可以看成是 LocalDateTime + ZoneId。

builder()

暂时补充一些内容,后期整理

·规则引擎

基于一系列规则,其中每个规则定义了特定条件下的行为或决策。这些规则通常以类似于“如果条件A成立,则执行操作B”的形式表示。通过将规则从主要的业务逻辑中分离出来,我们能够更好地维护和更新应用程序,同时提高代码的可读性和可维护性。在软件开发领域,规则引擎是一种强大的工具,它为开发人员提供了一种灵活而可维护的方法来处理复杂的决策逻辑。不同于硬编码所有可能的条件和行为,规则引擎允许我们将这些规则独立出来,以一种更易于理解和修改的方式组织。


总结

整理未完成
部分内容参考:https://javaguide.cn

  • 29
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值