我在教程中读到,当使用方法引用时,参数必须在函数接口的方法和我们引用的方法中匹配。所以我得到了下面的错误。
public class MethodRefTest
{
public static void m1(int i)
{
System.out.println("Hey in method 1");
}
public static void main(String[] args)
{
Runnable r=MethodRefTest::m1; //Compile time error
}
}既然我已经理解了为什么会出现这个错误,请看下面的代码片段
package com;
public class Transaction {
private int id;
private int value;
public Transaction(int id,int value)
{
this.id=id;
this.value=value;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
package com;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class MethodRefTest {
public static void main(String[] args)
{
Transaction t1=new Transaction(1,20);
Transaction t2=new Transaction(2,30);
List<Transaction> list=new ArrayList<Transaction>();
list.add(t1);
list.add(t2);
List<Integer> intList=list.stream().map(Transaction::getId).collect(Collectors.toList());
System.out.println(intList);
}
}在我使用的map方法中,它接受FunctionalInterface函数,而我使用的方法引用没有任何参数,但是Function的...but (T t)方法有一个参数,而getId()没有任何参数,在这种情况下,即使参数不匹配,它也不会抛出任何错误。
请帮助我理解这一点?
发布于 2019-03-15 02:03:00
但Function的apply(T t)方法有一个参数,而getId()没有任何参数
apply函数接受一个参数作为一种类型的数据,并返回另一种类型的数据。在你的例子中,就好像是:
public Integer apply(Transaction transaction) {
return transaction.getId();
}当然,map操作中的完整Function将转换的输入和输出类型定义为:
new Function<Transaction, Integer>() {
@Override
public Integer apply(Transaction transaction) {
return transaction.getId();
}
}相反,在您的代码中,m1需要向其提供整数类型的参数,这将导致void输出。因此,您的实现与Consumer相匹配,并且可以表示为:
Consumer<Integer> consumer = MethodRefTest::m1发布于 2019-03-15 02:03:06
方法引用
Transaction::getId等于lambda表达式
(Transaction t) -> t.getId()您可以看到,它接受Transaction参数并返回int值
这是一个完全有效的Function<Transaction, Integer>签名,因为它完全满足了它的要求。
https://stackoverflow.com/questions/55169178
复制相似问题