java8-函数式接口

函数式接口

概念

有且只有一个抽象方法的接口,函数式接口,即适用于函数式编程场景的接口。而Java中的函数式编程体现就是Lambda,所以函数式接口就是可

以适用于Lambda使用的接口。只有确保接口中有且仅有一个抽象方法,Java中的Lambda才能顺利地进行推导。这个和java的语法糖在原理上是不同的。

格式

只要确保接口中有且仅有一个抽象方法即可。可以有其他的默认方法等。

修饰符 interface 接口名称 {
    
		public abstract 返回值类型 方法名称(可选参数信息); 
		// 其他非抽象方法内容 
}

接口中的方法默认是public abstract的,所以public abstract还可以省去。

@FunctionalInterface注解

@FunctionalInterface 
public interface MyFunctionalInterface {
    
    void myMethod(); 
}

函数接口的强制性检查,如果不满足函数接口的定义将抛出异常。这个注解只是一个强制检查,只要定义对了,就算没有这个注解,函数接口也是成立的。

自定义函数接口

public class Demo09FunctionalInterface {
    
	// 使用自定义的函数式接口作为方法参数 
	private static void doSomething(MyFunctionalInterface inter) 
	{
    
		inter.myMethod(); // 调用自定义的函数式接口方法 
	}
	public static void main(String[] args) {
    
		// 调用使用函数式接口的方法 
		doSomething(()> System.out.println("Lambda执行啦!")); 
	}
}

函数式接口常用的地方就是作为函数的参数。由于只有一个方法,所以我们可以在把这个接口作为参数的方法被调用的时候再定义函数的内容。

函数式编程

lambda的延迟执行

比如如下情况:

public class Demo01Logger {
    
    private static void log(int level, String msg) {
    
        if (level == 1) {
    
            System.out.println(msg); 
        } 
    }
    public static void main(String[] args) {
    
        String msgA = "Hello"; 
        String msgB = "World"; 
        String msgC = "Java"; 
        log(1, msgA + msgB + msgC); 
    }
}

缺陷是:如果level不等于1,这个逻辑不会执行,但是msgA + msgB + msgC还是会执行。

改用lambda表达式实现:

@FunctionalInterface 
public interface MessageBuilder {
    
    String buildMessage(); 
}
public class Demo02LoggerLambda {
    
    private 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值