Java 8革新:现代编程的全新标准与挑战

在这里插入图片描述

一、方法引用

方法引用是Java 8中一种简化Lambda表达式的方式,通过直接引用现有方法来代替Lambda表达式。

方法引用使得代码更加简洁和易读,特别是在处理函数式接口时,可以替代相对冗长的Lambda表达式,提高了代码的可维护性和可读性。

方法引用通常可以分为以下几种类型:

  • 静态方法引用:引用某个类的静态方法。ClassName::staticMethodName
  • 实例方法引用:引用某个对象的实例方法。objectInstance::instanceMethodName
  • 构造方法引用:引用类的构造方法来创建该类的实例。ClassName::new
  1. 静态方法引用

定义一个函数式接口,定义一个抽象方法 convert,接收一个类型为 F 的参数,并返回一个类型为 T 的结果。

@FunctionalInterface
interface Converter<F, T> {
    T convert(F from);
}

有一个静态方法 StringHelper 中的静态方法 toUpperCase

class StringHelper {
    public static String toUpperCase(String str) {
        return str.toUpperCase();
    }
}

使用静态方法引用来创建一个 Converter 实例。

/**
 * StringHelper::toUpperCase 就是静态方法引用,它引用了 StringHelper 类的 toUpperCase 方法,该方法的签名与 Converter 接口中的 convert 方法兼容
 */
Converter<String, String> converter = StringHelper::toUpperCase;
String convertedStr = converter.convert("hello");
System.out.println(convertedStr); 

// 输出: 
HELLO
  1. 实例方法引用

定义一个类 StringUtils,有一个实例方法 startsWithIgnoreCase

class StringUtils {
    public boolean startsWithIgnoreCase(String str, String prefix) {
        // 检查一个字符串是否以另一个字符串开头(忽略大小写)
        return str.toLowerCase().startsWith(prefix.toLowerCase());
    }
}

使用实例方法引用来创建一个 BiPredicate 实例:

/**
 * 方法引用允许我们在 BiPredicate 接口的上下文中使用 startsWithIgnoreCase 方法作为一个函数,第一个参数作为方法的调用者(即 stringUtils 对象),第二个参数作为方法的参数传递
 */
StringUtils stringUtils = new StringUtils();

// 使用实例方法引用创建 BiPredicate 实例
BiPredicate<String, String> startsWithIgnoreCase = stringUtils::startsWithIgnoreCase;

// 测试 startsWithIgnoreCase 方法引用的效果,调用 test 方法来检查字符串 "Java" 是否以 "ja" 开头(忽略大小写)
boolean result = startsWithIgnoreCase.test("Java", "ja");
System.out.println(result); 
// 输出:
true
  1. 构造方法引用

定义一个类 Person,它有一个构造方法 Person(String name, int age)

class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

使用构造方法引用来创建一个 Supplier 实例。

// 使用构造方法引用创建 Supplier 实例
Supplier<Person> personSupplier = Person::new;
// 获取 Person 对象
Person person = personSupplier.get();

// 设置 Person 对象的属性
person = new Person("Alice", 30);
System.out.println(person.getName() + ", " + person.getAge());

// 输出: 
Alice, 30

在这里,Person::new 是构造方法引用,它引用了 Person 类的构造方法,根据 Supplier 的函数签名,Java 编译器会自动推断使用哪个构造方法。

是不是感觉构造方法引用有点多余,这样有什么好处吗?为什么不直接new一个构造函数,这样不显得多此一举吗 ?

使用构造方法引用和 Supplier 接口结合起来的好处

  1. 延迟实例化和懒加载
    • 当你使用构造方法引用创建 Supplier 实例时,实际的对象并没有立即被创建。
    • 只有在调用 Supplierget() 方法时,才会真正创建对象。这种方式可以延迟对象的实例化,直到真正需要使用它时。
  2. 与函数式接口的兼容性
    • Supplier 是一个函数式接口,它通常用于表示一个供给型的操作,它不接受任何参数,返回一个指定类型的结果。
    • 使用构造方法引用可以非常自然地与函数式接口一起使用,因为构造方法引用本质上就是一种函数式的表达方式。
  3. 更加清晰和简洁的代码
    • 使用构造方法引用可以使代码更加简洁和易于理解,特别是在需要创建大量对象或者与函数式编程范式结合使用时。它减少了重复的代码,提高了代码的可读性。
  4. 支持方法引用的优势
    • 构造方法引用是方法引用的一种特殊形式,它直接引用类的构造方法。这允许你像引用方法一样引用构造方法,从而提供了更高的灵活性和可复用性。

二、接口默认方法

Java 8 引入了接口的默认方法,这是一种在接口中定义具有默认实现的方法的方式。默认方法允许接口在不破坏现有实现的情况下,向现有的接口添加新的方法。

特点和用途

  1. 默认实现
    • 默认方法在接口中可以提供方法的具体实现,可以直接在接口中定义,并提供一个默认的方法体。
  2. 向后兼容性
    • 默认方法的引入使得现有的接口能够以向后兼容的方式进行扩展。
    • 当接口被新方法扩展时,实现这个接口的所有类都不需要修改现有代码。
  3. 多继承问题的解决
    • 默认方法允许接口在不引入抽象类的情况下定义方法的具体实现。
    • 一个类可以实现多个接口并继承多个默认方法,解决了传统接口不支持多继承的问题。
  4. 接口的演进
    • 默认方法使得接口在 Java 8 中具备了更强的功能,可以像抽象类一样拥有一些默认行为,同时保持其灵活性和扩展性。
interface Vehicle {
    // 抽象方法
    void start(); 

    // 默认方法
    default void stop() {
        System.out.println("Vehicle stopped"); 
    }
}

class Car implements Vehicle {
    @Override
    public void start() {
        System.out.println("Car started");
    }

    // 可选:覆盖默认方法
    @Override
    public void stop() {
        System.out.println("Car stopped");
    }
}

public class Main {
    public static void main(String[] args) {
        Vehicle car = new Car();
        // 输出: Car started
        car.start(); 
        // 输出: Car stopped
        car.stop();  
    }
}

一个类实现了多个接口,这些接口中有相同签名的默认方法(包括继承关系),那么编译器会要求显式地覆盖冲突的默认方法,以消除二义性。

冲突主要存在的情况

  1. 同名同参的默认方法:如果一个类实现了多个接口,这些接口中有相同签名(方法名和参数列表相同)的默认方法,则需要在实现类中手动提供具体实现,从而消除二义性。
  2. 接口继承冲突:如果一个接口继承了另一个接口,并且提供了一个与父接口中默认方法签名相同但默认实现不同的方法,实现类必须覆盖这个方法来解决二义性。
interface InterfaceA {
    default void greet() {
        System.out.println("Hello from InterfaceA");
    }
}

interface InterfaceB {
    default void greet() {
        System.out.println("Hello from InterfaceB");
    }
}

// 实现类实现了多个接口,这些接口中有同名的默认方法 greet()
class MyClass implements InterfaceA, InterfaceB {
    // 需要手动实现 greet() 方法,消除二义性
    @Override
    public void greet() {
        // 可以选择调用 InterfaceA 的默认实现
        InterfaceA.super.greet(); 
        // 也可以自己实现
    }
}

public class Main {
    public static void main(String[] args) {
        MyClass obj = new MyClass();
        obj.greet(); 
    }
}

// 输出: 
Hello from InterfaceA

三、接口静态方法

接口静态方法是Java 8引入的一个重要特性,它们扩展了接口的功能,使得接口可以包含静态的方法实现。这种方法通常用于定义一些通用的工具方法,或者提供与接口实例无关的共享代码。静态方法的引入使得Java接口在语法上更加灵活和功能强大。

特点和用途

  1. 方法实现
    • 接口静态方法可以直接在接口中提供方法的具体实现。这些方法使用 static 关键字声明,并且可以有方法体。
  2. 工具方法
    • 静态方法通常用于提供一些通用的工具方法,这些方法与接口的实例无关,直接通过接口名调用。
  3. 代码重用
    • 静态方法可以在接口中定义一些常见的实用方法,以便多个类或实现接口的类共享和重用这些方法。
  4. 不可被继承
    • 接口的静态方法不能被实现该接口的类所继承或覆盖。这使得静态方法的行为与类的静态方法有所不同,类的静态方法可以被继承或隐藏。
interface UtilityInterface {
    // 静态方法
    static void printMessage(String message) {
        System.out.println("Message from interface: " + message);
    }

    // 抽象方法
    void processData(String data);
}

class MyClass implements UtilityInterface {
    @Override
    public void processData(String data) {
        System.out.println("Processing data: " + data);
    }
}

public class Main {
    public static void main(String[] args) {
        // 调用静态方法
        UtilityInterface.printMessage("Hello, world!"); 
        MyClass obj = new MyClass();
        obj.processData("Sample Data");
    }
}

四、集合遍历forEach()方法

集合类(如List、Set、Map等)引入了一个新的方法 forEach(),用于简化集合的遍历操作。这个方法可以在集合类的实例上直接调用,接受一个函数式接口的实现作为参数,用来定义遍历集合时的操作。

  1. List 遍历
import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");

        // 使用 forEach() 遍历输出每个元素
        names.forEach(name -> System.out.println(name));
        
        // 也可以使用方法引用
        names.forEach(System.out::println);
    }
}
  1. Set 遍历
import java.util.HashSet;
import java.util.Set;

public class Main {
    public static void main(String[] args) {
        Set<Integer> numbers = new HashSet<>();
        numbers.add(1);
        numbers.add(2);
        numbers.add(3);

        // 使用 forEach() 遍历输出每个元素
        numbers.forEach(number -> System.out.println(number));
    }
}
  1. Map 遍历
import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        Map<Integer, String> map = new HashMap<>();
        map.put(1, "One");
        map.put(2, "Two");
        map.put(3, "Three");

        // 使用 forEach() 遍历输出每个键值对
        map.forEach((key, value) -> System.out.println(key + " -> " + value));
    }
}

注意事项:

  • forEach() 方法不能保证集合元素的顺序,具体取决于集合的实现类。
  • 在遍历过程中,不建议修改集合的结构,这可能会导致 ConcurrentModificationException 异常。

好的木材并不在顺境中生长,风越强,树越壮

提供典型应用案例,剖析JSP/Servret技术与Struts 2技术在Web开发中的不同 提供完整的应用案例,使读者可以深入体会SSH开发模式的精髓 所有开发工具和框架均使用目前的最新版本,紧跟技术发展的趋势 提供230个实例和4个综合案例,可以作为案头必备的查询手册 一线开发人员全力打造,分享技术盛宴! 重点内容及特色 《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》介绍了Web开发中客户端技术的基础知识,包括JavaScript、CSS、AJAX等,这些技术都是Web应用中常用的客户端技术。 《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax+》讲解了JSP/S rvlet技术的基础知识,并提供了一个综合案例展示其具体应用,它们是Java Web服务端技术的基石,也是学习Java Web开发所要必须掌握的技术。 《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》重点讲解了Struts 2、Speing和HIbernate框架的基础知识和高级技术,如Sruts 2中的*、类型转换、国际化和标签等,HIbe rna{e的会话、0/R映射和事务管理等,Spring中的数据库技术与AOP等。 《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》特别介绍了Struts 2对AjAX的支持,还重点剖析了SSH框架的整合开发,并给出了两个综合案例来展示整合SSH框架开发Web应用。 和已经出版的同类图书相比,《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》讲解由浅入深,涵盖更多内容,列举了大量典型实例具有超强的实用性,另外,《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》各篇独立,适合读者全面学习或对部分内容重点学习。 读者对象 有Java基础,想进一步学习SSH框架整合开发的人员 了解SSH整合开发,想进一步提高开发技术的人员 正在使用SSH整合技术开发项目,想查阅资料的人员 大中专院校的学生和老师,以及Java培训班的学员和讲师 需要一本案头必备查询手册的程序员 光盘内容 6小时多媒体体视频讲解 《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》所涉及的源代码 布衣暖,菜根香,好书滋味长!清华大学出版社长期以来一直秉承为读者多出好书的宗旨,多年来为读者奉献了大量脍炙人口的精品图书。尤其在计算机图书出版领域更是形成了鲜明特色,所出版的各类计算机图书受到了广大读者的好评。本次出版的“原创经典,程序员典藏”系列图书是清华大学出版社的重点精品计算机图书,旨在帮助读者全面学习各类程序设计语言和开发工具,提高开发水平。同时也为广大程序员提供良好的技术参考,以便作为案头必备的查询手册。 内容提要 -------------------------------------------------------------------------------- 《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》通过对SSH中的各种技术循序渐进地讲解,使读者尽快掌握开发基于SSH的Web程序的方法。《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》内容包括Web客户端技术、JSP/Servlet技术、Struts 2(*、类型转换、输入校验、上传和下载文件、Struts 2的各种标签、对 AJAX的支持等)、Spring(Ioc容器、装配Java Bean、Jdbc和Hibernate模板、事务管理、Spring AOP等)以及 Hibernate(会话、映射、标准查询API、HQL、事务管理、锁等)。除此之外,《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》还提供了两个完整的实例来讲解开发SSH的详细步骤和方法。通过对这两个实例的学习,读者可以对SSH开发模式有更透彻地理解和认识。SSH是目前最流行的Java Web开发技术。 《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》适合广大从事Java Web开发工作的技术人员、对SSH开发感兴趣的人员以及大专院校学生阅读,尤其是具有一定的Web开发经验的技术人员。 目录 -------------------------------------------------------------------------------- 第1篇 web开发基础篇 第1章 搭建开发环境 1.1 本书使用的软件和框架的版本 1.2 JDK6的下载与安装 1.3 Eclipse3.4 的下载与安装 1.4 MyEclipse6.5 的下载与安装 1.5 Eclipse:IDEforJavaEEDevelopers的下载与安装 1.6 Tomcat6的下载与安装 1.7 在MyEclipse中配置。Tomcat 1.8 在EclipseIDEforJavaEEDevelopers中配置Tomcat 1.9 小结 第2章 JavaWeb应用开发基础 2.1 Web技术的发展 2.2 JavaWeb技术 2.2.1 Java.Welb程序的基本组成 2.2.2 Java,Web程序的目录结构 2.2.3 JavaWeb程序的配置文件 2.3 MVC模式与MvC框架 2.3.1 JSP模型1和JSP模型2 2.3.2 Web应用程序需要的基础服务 2.3.3 MVC模式概述 2.3.4 常用的MvC框架 2.4 小结 第3章 Web开发中的客户端技术 3.1 常用的JavaScriptIDE简介 3.1.1 在MyEclipse中使用JavaScript 3.1.2 在EclipseIDEforJavaEE中使用JavaScript 3.1.3 在NetBeans中使用JavaScript 3.1.4 其他的JavaScriptIDE 3.2.1 avaScdpt语法基础 3.2.1 实例:编写第一个JavaScript程序:Greet 3.2.2 变量 3.2.3 原始类型 3.2.4 类型转换 3.2.5 函数与函数调用 3.2.6 类和对象 3.3 JavaScript高级技术 3.3.1 DOM技术概述 3.3.2 获得HTML元素的3种方法 3.3.3 实例:图像自动切换 3.3.4 正则表达式 3.3.5 实例:表格排序 3.4 CSS基础 3.4.1 CSS的基本语法 3.4.2 在Style属性中定义样式 3.4.3 在HTML中定义样式 3.4.4 在外部文件中定义样式 3.4.5 样式的继承 3.5 AJAX.基础 3.5.1 AJAX概述 3.5.2 实例:使用XMLHttpRequest获得Web资源 3.5.3 实例:使用XMLHttpRequest跨域访问Web资源 3.5.4 实例:AJAX的3种交换数据方法 3.6 小结 第4章 Servlet技术 4.1 Servlet的Helloworld程序 4.1.1 实例:在My Eclipse中编写Helloworld程序 4.1.2 实例:手工编写:Helloworld程序 4.2 Servlet基础 4.2.1 配置数据库连接池 4.2.2 数据库连接池的应用 4.2 -3实例:用doGet方法处理客户端请求 4.2.4 实例:用doPost方法处理客户端请求 4.2.5 实例:用service方法处理客户端请求 4.2.6 实例:初始化(init)和销毁(destroy)Servlet 4.2.7 实例:使用PrintWriter输出响应消息 4.2.8 实例:用ServletOutputStream显示图像 4.2.9 实例:使用RequestDispatcher包含Web资源 4.2.10 实例:使用RequestDispatcher转发Web资源 4.3 HttpServletResponse类的其他功能 4.3.1 产生状态响应码 4.3.2 设置响应消息头 4.3.3 实例:验证响应头设置情况 4.4 使用:HttpServletRequest获得请求消息 4.4.1 获取请求行消息 4.4.2 获取网络连接消息 4.4.3 获取请求头消息 4.5 处理Cookie 4.5.1 什么是Cookie 4.5.2 Cookie类中的方法 4.5.3 实例:用Cookie读写客户端信息 4.5.4 实例:用Cookie读写复杂数据 4.6 处理Session 4.6.1 什么是Session 4.6.2 HttpSession接口中的方法 4.6.3 HttpServletRequest接口中的Session方法 4.6.4 实例:通过Cookie跟踪Session 4.6.5 实例:通过重写uRL跟踪Session 4.7 Web开发的中文问题 4.7.1 Java的编码原理 4.7.2 实例:解决输出中文乱码问题 4.7.3 实例:解决服务端程序读取中文请求消息的乱码问题 4.7.4 实例:用AJAX技术发送和接收中文信息 4.7.5 实例:在请求消息头和响应消息头中转输中文 4.8 小结 第5章 JSP技术 5.1 用MyEclipse编写第一个JSP程序 5.1.1 实例:编写显示服务器当前时间的JSP程序 5.1.2 调试JSP程序 5.1.3 改变JSP的访问路径和扩展名 5.1.4 手动发布JSP程序 5.2 JSP的运行原理 5.2.1 Tomcat如何处理JSP页 5.2.2 分析由JSP生成的Servlet代码 5.3 JSP基本语法 5.3.1 JSP表达式 5.3.2 在JSP中嵌入Java代码 5.3.3.JSP声明 5.3.4.JSP表达式语言(EL) 5.3.5 实例:用EL函数替换HTML中的特殊字符 5.3.6 JSP页面中的注释 5.4 JSP指令 5.4.1 JSP指令简介 5.4.2 page页面指令 5.4.3 include加入指令 5.5.JSP的9个内置对象 5.5.1 out输出对象 5.5.2 pageContext封装对象 5.5.3 其他的JSP内置对象 5.6 JSP标签 5.6.1 插入标签 5.6.2 转发标签 5.6.3 传参标签 5.6.4 创建:Bean标签 5.6.5 设置属性值标签 5.6.6 获取属性值标签 5.7 JSP的标准标签库(JSTL) 5.7.1 如何使用JSTL 5.7.2 条件标签 5.7.3 循环标签 5.8 小结 第6章 用Servlet和JSP实现注册登录系统 第2篇 Struts 2篇 第7章 编写Struts 2的第一个程序 第8章 Struts 2进阶 第9章 Struts 2的* 第10章 Struts 2的类型转换 第11章 Struts 2的输入校验 第12章 文件的上传和下载 第13章 国际化 第14章 Struts 2的标签库 第15章 Struts 2对AJAX的支持 第16章 用Struts 2实现注册登录系统 第3篇 Hibernate篇 第17章 Hibernate的Helloworld程序 第18章 配置Hibernate 第19章 Hibernate的会话与O/R映射 第20章 Hibernate的查询与更新技术 第21章 Hibernate的高级技术 第4篇 Spring篇 第22章 Spring的Helloworld程序 第23章 反向控制(Ioc)与装配JavaBean 第24章 Spring中的数据库技术 第25章 Spring的其他高级技术 第5篇 综合实例篇 第26章 Struts 2与Hibernate、Spring的整合 第27章 网络硬盘 第28章 论坛系统
评论 257
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

忆~遂愿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值