diff --git a/docs/chapter05.md b/docs/chapter05.md index d84ebee..907ab93 100644 --- a/docs/chapter05.md +++ b/docs/chapter05.md @@ -175,7 +175,7 @@ interface Greeting { } Greeting greet = (String name) -> System.out.println("Hello, " + name); -greet.greet("Kimi"); // 输出 "Hello, Kimi" +greet.greet("Java"); // 输出 "Hello, java" ``` ###### 一个参数和有返回值 @@ -183,11 +183,11 @@ greet.greet("Kimi"); // 输出 "Hello, Kimi" ```java @FunctionalInterface interface Converter { - String convert(String from, String to); + String convert(String from); } -Converter converter = (from, to) -> from.toUpperCase() + to.toLowerCase(); -System.out.println(converter.convert("Java", "Python")); // 输出 "JAVApython" +Converter converter = (from, to) -> from.toUpperCase(); +System.out.println(converter.convert("Java")); // 输出 "JAVA" ``` ###### 多个参数和有返回值 @@ -208,23 +208,91 @@ System.out.println(add.calculate(5, 10)); // 输出 15 ###### 静态方法引用 +静态方法/类方法(static修饰的方法)引用 + +> 语法: 类名::方法名 + +**注意事项:** +- 被引用的方法参数列表和函数式接口中抽象方法的参数一致!! +- 接口的抽象方法没有返回值,引用的方法可以有返回值也可以 +- 接口的抽象方法有返回值,引用的方法必须有相同类型的返回值!! +- 由于满足抽象参数列表与引用参数列表相同,所以可以写成静态方法引用的格式 + ```java -Converter concat = String::concat; -System.out.println(concat.convert("Hello, ", "Kimi")); // 输出 "Hello, KimiHello, " +public class StringUtils { + public static String concatenate(String from, String to) { + return from + ", " + to; + } +} +``` + +```java +Converter concat = StringUtils::concatenate; +System.out.println(concat.convert("Hello", "Lambda")); // 输出 "Hello, Lambda" ``` ###### 实例方法引用 +实例方法(非static修饰的方法)引用 +> 语法: 对象名:∶非静态方法名 + +**注意事项:** +- 被引用的方法参数列表和函数式接口中抽象方法的参数一致!! +- 接口的抽象方法没有返回值,引用的方法可以有返回值也可以没有 +- 接口的抽象方法有返回值,引用的方法必须有相同类型的返回值! ```java -Converter append = StringBuilder::append; -System.out.println(append.convert("Hello, ", "Kimi")); // 输出 "Hello, Kimi" +public class Combiner { + public String combine(String part1, String part2) { + return part1.toUpperCase() + ", " + part2.toUpperCase(); + } +} +``` + +```java +Combiner combiner = new Combiner(); +Converter append = combiner::combie; +System.out.println(append.convert("Hello", "Lambda")); // 输出 "Hello, Lambda" ``` ###### 构造函数引用 +构造方法引用 +> 语法: 类名::new + +**注意事项:** +- 被引用的类必须存在一个构造方法与函数式接口的抽象方法参数列表一致 ```java -Converter toStringBuilder = StringBuilder::new; -System.out.println(toStringBuilder.convert("Hello, ", "Kimi")); // 输出 "Hello, Kimi" +// 假设我们有一个简单的类 +class Example { + private final int value; + + public Example(int value) { + this.value = value; + } + + @Override + public String toString() { + return "Example{" + "value=" + value + '}'; + } +} + +// 接口定义,需要与Example的构造函数匹配 +interface ExampleSupplier { + Example get(); +} + +public class Main { + public static void main(String[] args) { + // 使用lambda表达式和构造函数引用创建ExampleSupplier实例 + ExampleSupplier supplier = () -> new Example(42); + + // 使用ExampleSupplier实例来创建Example对象 + Example example = supplier.get(); + + // 输出结果 + System.out.println(example); + } +} ``` ##### Lambda 表达式与 Stream API