Java赋值运算符返回lambda表达式中的值

Java赋值运算符返回lambda表达式中的值,java,lambda,java-8,operators,Java,Lambda,Java 8,Operators,在java中,如果我们编写 int a = 3; int b = (a = 100); System.out.println(b) // 100 然后b将实际具有100的数据,因为赋值运算符=返回一个值 当我将其与lambda表达式组合时,会发生一件奇怪的事情: public static void main(String[] args) { Function<Integer, Integer> func = i -> i = 1; // COMPILES

在java中,如果我们编写

int a = 3;
int b = (a = 100);
System.out.println(b) // 100
然后
b
将实际具有100的数据,因为赋值运算符
=
返回一个值

当我将其与lambda表达式组合时,会发生一件奇怪的事情:

public static void main(String[] args) {    
    Function<Integer, Integer> func = i -> i = 1;   // COMPILES
    Consumer<Integer> con = i -> i = 1;             // ALSO COMPILES
    Consumer<Integer> con2 = i -> 1                 // DOES NOT COMPILE

    System.out.println(func.apply(34));             // 1
    con.accept(12);
}
publicstaticvoidmain(字符串[]args){
函数func=i->i=1;//编译
消费者con=i->i=1;//也编译
消费者con2=i->1//未编译
System.out.println(函数应用(34));//1
con.接受(12);
}
在第一个lambda表达式中,
函数
接受一个值并返回一个值,这很有意义

然而,消费者不应该返回任何值。在这种情况下,它会这样做,并且代码仍然可以编译


谁能给我解释一下吗?谢谢。

i=1
是一个表达式,也是一个语句。它有一个
int

由于它是一条语句,因此可以用作lambda表达式的主体,该表达式实现了一个函数接口,该函数接口的方法具有
void
返回类型

就像你被允许写:

public void accept (int i) 
{
    i = 1;
}
另一方面,
1
是一个不是语句的表达式。因此,它不能用作实现函数接口的lambda表达式的主体,该函数接口的方法具有
void
返回类型

就像你不能写一样:

public void accept (int i) 
{
    1;
}

消费者将忽略退货类型谢谢您的回复,但这并没有回答我的问题。首先,在第一个方法中,为了匹配我的lambda,它应该是return(i=1);?第二个方法是语法错误,所以我们当然不能这样写。所以我的问题是为什么i->i=1适用于消费者和函数?@AnhMinhTran我的两个示例方法解释了为什么
Consumer con=i->i=1
通过编译,而Consumer con2=i->1不通过编译。我刚刚阅读了这个链接中的解释:这对我来说很有意义。这只是Java开发人员为了方便而做的事情吗?只要函数与参数匹配,如果它返回多余的内容,就忽略它?@AnhMinhTran我不确定你指的是哪个答案。第二个(未被接受的)答案在我看来是正确的答案(
设计决策的基础是允许以调用方法的相同方式将方法调整到功能接口,即,可以调用每个值返回方法并忽略返回值。
)。