Java 中SAM的Lambda表达式的条件测试
2016-04-06 20:40
387 查看
作为新奇玩意儿的Lambda表达式,如果只是使用Java中自带的SAM Interfcace来玩,难免就太没意思了,所以本文将逐渐讨论如何在以后的编码活动中使用自定义的SAM Interface。
可以看到,在一个拥有两个方法(不含默认方法)的接口中,是不可以使用Lambda表达式的,当一个接口中只有一个抽象方法,即达成了SAM(Single Abstract Method)条件时,Lambda表达式才可以使用,即使它有至少一个的默认方法。
/** * Created by simon on 2016/4/6. */ public class SAMTest { public static void main(String[] args) { SAMTest test = new SAMTest(); test.oneMethodTest(i -> i); // test.twoMethodTest(i -> i); 错误,无法通过编译 // test.twoMethodTest((i, i) -> i + i); 错误,无法通过编译 test.defaultMethodTest(i -> i); test.defaultMethodTest(new OneMethodWithDefaultInterface() { @Override public int test4(int i) { return defaultMethod(i); } }); // 在重写了接口方法的情况下不能够使用Lambda } }
/** * * @param oneMethodInterface */ public void oneMethodTest(OneMethodInterface oneMethodInterface) { oneMethodInterface.toString(); } /** * SAM */ @FunctionalInterface public interface OneMethodInterface { int test3(int i); }
/** * 用来测试有两个方法的Interface * * @param twoMethodInterface */ public void twoMethodTest(TwoMethodInterface twoMethodInterface) { twoMethodInterface.toString(); } /** * 两个方法的接口 */ public interface TwoMethodInterface { int test1(int i, int p); int test2(int i); }
public void defaultMethodTest(OneMethodWithDefaultInterface defaultInterface) { defaultInterface.defaultMethod(1); } /** * 一个方法加一个默认方法的接口 */ public interface OneMethodWithDefaultInterface { int test4(int i); default int defaultMethod(int i) { System.out.println(i * i); return i * i; } }
可以看到,在一个拥有两个方法(不含默认方法)的接口中,是不可以使用Lambda表达式的,当一个接口中只有一个抽象方法,即达成了SAM(Single Abstract Method)条件时,Lambda表达式才可以使用,即使它有至少一个的默认方法。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树