您的位置:首页 > 编程语言 > Java开发

Java 中SAM的Lambda表达式的条件测试

2016-04-06 20:40 387 查看
作为新奇玩意儿的Lambda表达式,如果只是使用Java中自带的SAM Interfcace来玩,难免就太没意思了,所以本文将逐渐讨论如何在以后的编码活动中使用自定义的SAM Interface。

/**
* 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 lambda java8 SAM