Lambda表达式3:方法引用和构造器引用

本文深入解析Java中的方法引用,涵盖类::静态方法名、类::实例方法名、构造器引用和数组引用等核心概念。通过具体示例,展示如何利用方法引用简化Lambda表达式,提高代码可读性和效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、基础介绍

当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用。
使用操作符 “ ::” 将方法名和对象或类的名字分隔开来。
Lambda 体中调用方法的参数列表与返回值类型要与函数式接口中抽象方法的函数列表和返回值类型保持一致。
若Lambda 参数列表中的第一个参数是实例方法的调用者,而第二个参数是实例方法的参数时,可以使用ClassName::method。

2、方法引用

2.1、类::静态方法名
@Test
public void test1(){
	// 写法1:
	Consumer<String> consumer = (x) -> System.out.print(x);
	
	// 写法2:
	PrintStream ps = System.out;
	Consumer<String> con = ps::println;
	
	// 写法3:
	Consumer<String> con1 = System.out::println;
	con1.accept("11");
}
2.2、类::静态方法名
@Test
public void test3(){
	// 写法1:
	Comparator<Integer> com = (x, y) -> Integer.compare(x, y);
	
	// 写法2:
	Comparator<Integer> com1 = Integer::compare;
	Integer result = com1.compare(1, 2);
	System.out.println(result);
}
2.3、类::实例方法名
@Test
public void test4(){
	// 写法1:
	BiPredicate<String, String> bp = (x, y) -> x.equals(y);
	
	// 写法2:
	BiPredicate<String, String> bp1 = String::equals;
	boolean result = bp1.test("1", "1");
	System.out.println(result);
}

BiPredicate<T, U>:函数式接口
参数:T,U;
返回类型:boolean;
包含方法为 boolean test(T t, U u);

3、构造器引用

需要调用的构造器的参数列表要与函数式接口中抽象方法的参数保持一致

Supplier<Student> sup1 = Student::new;
System.out.println(sup1.get());

Function<String, Student> fun = Student::new;
System.out.println(fun.apply("weiwei"));

BiFunction<String, Integer, Student> bf = Student::new;
System.out.println(bf.apply("weiwei", 2));

BiFunction<T, U, R>:函数式接口;
参数:T,U;
返回类型:R;
包含方法为 R apply(T t, U u);

4、数组引用

@Test
public void test6(){
	// 写法1:
	Function<Integer, Integer[]> fun = (x) -> new Integer[x];
	System.out.println(fun.apply(2).length);
	// 写法2:
	Function<Integer, Integer[]> fun2 = Integer[]::new;
	System.out.println(fun2.apply(3).length);
}
<think>好的,我现在需要回答用户关于Java中Lambda表达式使用方法、语法以及::操作符的问题。首先,我要确保自己理解Lambda表达式的基本概念。Lambda表达式是Java 8引入的重要特性,用于简化函数式接口的实现。函数式接口是只有一个抽象方法的接口,比如Runnable或Comparator。 用户提到了使用方法语法,所以需要详细解释Lambda的语法结构。根据引用[1][2],Lambda的基本格式是(parameters) -> expression或代码块。例如,() -> System.out.println("Hello")是一个没有参数的Lambda表达式。参数类型可以显式声明,也可以让编译器推断,比如(a, b) -> a + b。 接下来是::操作符,即方法引用。这部分用户可能不太熟悉,需要分点说明。方法引用有四种类型:静态方法引用、实例方法引用、特定对象的实例方法引用构造器引用。例如,Math::sqrt是静态方法引用,System.out::println是特定对象的方法引用。 需要确保语法示例正确,比如正确使用箭头操作符方法引用符号。同时,要提到Lambda表达式在函数式接口中的实际应用,比如与Stream API结合使用,或者作为事件处理器。可能还需要对比传统匿名内部类Lambda表达式的区别,突出Lambda的简洁性。 用户的问题可能涉及到如何将Lambda应用于实际编码,所以需要举一些常见的例子,比如排序集合、线程初始化等。同时,注意指出Lambda的局限性,比如只能用于函数式接口,不能单独使用。 最后,按照用户要求生成相关问题。问题应该围绕Lambda的高级用法、与匿名类的对比、方法引用的其他形式以及实际应用场景。确保问题有针对性,能够帮助用户进一步学习。 检查是否有遗漏的部分,比如是否涵盖了所有类型的语法结构方法引用的各种情况。确保引用标识正确添加,例如在提到语法结构时引用提供的资料。保持回答结构清晰,分点说明,代码示例用正确的格式标记,避免技术错误。</think>### Java Lambda表达式语法及方法引用(::)详解 Java 8引入的Lambda表达式是函数式编程的核心特性,其语法结构遵循以下规则: **一、基础语法结构** 1. 标准形式:`(参数列表) -> { 代码块 }` 2. 简写形式(单行语句可省略大括号return): ```java (a, b) -> a + b // 自动返回计算结果 ``` 3. 参数类型推断(编译器自动识别类型): ```java Comparator<String> comp = (s1, s2) -> s1.compareToIgnoreCase(s2) ``` **二、::操作符的四种方法引用类型** [^1][^2] 1. **静态方法引用**: ```java Function<Double, Double> sqrt = Math::sqrt; // 等价于 x -> Math.sqrt(x) ``` 2. **实例方法引用**: ```java List<String> list = Arrays.asList("a", "b"); list.forEach(System.out::println); // 等价于 x -> System.out.println(x) ``` 3. **特定对象的实例方法引用**: ```java StringComparator comparator = new StringComparator(); Collections.sort(list, comparator::compare); // 引用特定对象的实例方法 ``` 4. **构造器引用**: ```java Supplier<List<String>> listSupplier = ArrayList::new; // 等价于 () -> new ArrayList<>() ``` **三、典型应用场景** 1. 替代匿名内部类: ```java // 传统方式 new Thread(new Runnable() { public void run() { System.out.println("Running"); } }).start(); // Lambda方式 new Thread(() -> System.out.println("Running")).start(); ``` 2. 集合操作(配合Stream API): ```java List<Integer> numbers = Arrays.asList(1,2,3,4); numbers.stream() .filter(n -> n % 2 == 0) // Lambda表达式 .map(String::valueOf) // 方法引用 .forEach(System.out::println); ``` **四、注意事项** 1. 必须实现函数式接口(只有一个抽象方法的接口) 2. 局部变量使用要求: ```java int offset = 10; Function<Integer, Integer> adder = x -> x + offset; // offset必须是final或等效final ``` 3. 类型推断优先级: ```java // 显式声明参数类型 BinaryOperator<Integer> sum = (Integer a, Integer b) -> a + b; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值