java中Lambda表达式支持的方法引用和构造器引用

一 引用类方法

示例:类名::类方法

说明:函数式接口中被实现方法的全部参数传给该类方法作为参数

Lambda表达式:(a,b,...) -> 类名.类方法(a,b,...) / 类名::类方法 (只有一行调用类方法代码时)

@FunctionalInterface 
interface Converter {
    Integer convert(String form);
}

public class LambdaTest {
    public static void main(String[] args) {
        //Converter converter1 = Integer::valueOf;
		Converter converter1 = form -> Integer.valueOf(form);
		Integer val = converter1.convert("99");
		System.out.println(val);
    }
}

//result: 99
二 引用特定对象的实例方法

示例:特定对象::实例方法

说明:函数式接口中被实现方法的全部参数传给该方法作为参数

Lambda表达式:(a,b,...) -> 特定对象.实例方法(a,b,...) / 特定对象::实例方法 (只有一行时)

@FunctionalInterface
interface Converter {
    Integer convert(String form);
}

public class LambdaTest {
    public static void main(String[] args){
        //Converter converter2 = "xxx.xxx"::indexOf;
        Converter converter2 = form -> "xxx.xxx".indexOf(from);
        Integer val = converter2.convert("99");
        System.out.println(val);
    }
}
三 引用某类对象的实例方法

示例:类名::实例方法

说明:函数式接口中被实现方法的第一个参数作为调用者,后面的参数全部传给该方法作为参数

Lambda表达式:(a,b,...) -> a.实例方法(b,...) / 类名::实例方法 (一行)

@FunctionalInterface
interface Test {
	String test(String a, int b, int c);
}

public class LambdaTest {
	public static void main(String[] args){
		//Test t = String::substring;
        Test t = (a, b, c) -> a.substring(b, c);
        String s = t.test("vincent", 2, 5);
        System.out.println(s);
	}
}

//result: nce
四 引用构造器

示例:类名::new

说明:函数式接口中被实现方法的全部参数传给该构造器作为参数

Lambda表达式:(a,b,...) -> new 类名(a,b,...) / 类名::new (一行)

@FunctionalInterface
interface Test {
	JFrame win(String title);
}

public class LambdaTest {
	public static void main(String[] args) {
		//Test t = JFrame::new;
		Test t = (String a) -> new JFrame(a);
		JFrame jf = t.win("windows");
		System.out.println(jf);
	}
}
其他
Lambda表达式和匿名内部类

相同:

  1. Lambda表达式作为匿名内部类的简化,可以访问外部类的成员变量。
  2. 对于局部变量有隐式final修饰,不允许重新赋值。

区别:

  1. 匿名内部类可以为任意接口创建实例,只需要匿名内部类实现所有抽象方法,Lambda表达式只能为函数式接口创建实例。(@FunctionalInterface注解会检查接口是否为函数式接口)
  2. 匿名内部类可以为抽象类、普通类创建实例,Lambda表达式只能为函数式接口创建实例。
  3. 匿名内部类实现抽象方法的方法体允许调用接口中定义的默认方法,Lambda表达式不允许调用接口定义的默认方法。
jdk8 java.util.function预定义函数式接口
  1. xxxFunction: apply()抽象方法,对参数进行处理、转换,返回新值。
  2. xxxConsumer: accept()抽象方法,对参数处理,不返回结果
  3. xxxPredicate: test()抽象方法,对参数判断,筛滤数据,返回boolean
  4. xxxSupplier: getAsXxx()抽象方法,无参数,返回结果。

eg:

import java.util.Arrays;

public class LambdaTest {
    public static void main(String[] args) {
        String[] arr = new String[]{"java","ios","android"};
        Arrays.parallelSort(arr, (o1,o2) -> o1.length() - o2.length());
        System.out.println(Arrays.toString(arr));
    }
}

//result: [ios, java, android]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值