如果我们的lambda表达式使用了这个函数式接口,我们需要确保lambda表达式返回一个int类型的值。否则就会出现“lambda主体不是值也不与void兼容”的错误。 3.4.2 返回值 另一种可能性是lambda表达式没有返回值。在Java 8中,lambda表达式可以根据上下文推断出返回类型。如果lambda表达式没有返回值,我们可以使用void作为返回类型。
lambda表达式的目标类型是必须是一个函数式接口,也能够与目标类型进行兼容,lambda表达式的参数类型必须和接口的函数参数类型一致,它的返回值也必须和函数的返回值兼容,并且只能抛出函数类型允许的异常。 总结:同一个lambda表达式通过推断可以推断出不同的类型,是一个函数式接口的实例。 lambda表达式是对象吗? 他们是Object...
特殊的 void 兼容规则: 如果一个Lambda的主体是一个语句表达式, 它就和一个返回 void 的函数描述符兼容(当然需要参数列表也兼容)。 eg:以下两行都是合法的,尽管 List 的 add 方法返回了一个boolean ,而不是 Consumer 上下文( T -> void )所要求的 void。 List<String> stringList =newArrayList<>();// ...
如果一个Lambda的主体是一个语句表达式,它就和一个返回void的函数描述符兼容(当然需要从参数也兼容)。例如,以下两行都是合法的,尽管List的add方法返回了一个boolean,而不是Consumer上下文(T -> void)所需的void: //Predicate返回了一个booleanPredicate<String>p=(String s)->stringList.add(s);//Consu...
该接口可以被隐式的转换成Lambda表达式 如Runnable 接口就是一个函数式接口(在其内部只有一个抽象方法为 void run() ) package java.lang; /** * 此处省略源码注释 */ @FunctionalInterface public interface Runnable { /** *此处省略源码注释 */
Lambda表达式由三部分组成: (Apple a1,Apple a2) -> a1.getWeight().compareTo(a2.getWeight()); 参数列表:这里采用了Comparator中Compare方法的两个参数,两个 Apple。 箭头:-> 把参数和函数主体分开。 函数主体:比较两个Apple的重量,表达式就是Lambda的返回值了。
特殊的void兼容规则 如果一个Lambda的主体是一个语句表达式, 它就和一个返回 void 的函数描述符兼容(当然需要参数列表也兼容)。 举个例子: 以下两行都是合法的,尽管 List 的 add 方法返回了一个boolean ,而不是 Consumer 上下文( T -> void )所要求的 void ...
public static void main(String[] args) { HelloWorld hello = () -> System.out.println("Hello World!"); hello.world(); } } 如我们所见,如果运行此命令,我们的lambda函数已成功匹配该 HelloWorld 接口,并且该对象 hello 现在可以用于访问其方法。
如果Lambda 主体为语句,那么 Lambda 返回值就是语句的返回值 关于语句和表达式的区别,可以参考这篇文章,这里简单说一下:假设有一条语句int c = a + b;,那么表达式就是指c = a + b,即不包含int和;,每个表达式都会有一个计算值(void 也算一种特殊的计算值)。
3.3.6.2 同样的Lambda,不同的函数式接 了解了上面类型检查的概念,同一个lambda表达式就可以与不同的函数式接口联系起来,只要他们的抽象方法签名能够兼容。 特殊的void兼容规则 如果一个lambda的主体是一个语句表达式,他就可一个返回void的函数描述符兼容(当然参数列表页需要兼容)。