首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >java 8中的方法引用?

java 8中的方法引用?
EN

Stack Overflow用户
提问于 2019-03-15 01:58:54
回答 2查看 571关注 0票数 1

我在教程中读到,当使用方法引用时,参数必须在函数接口的方法和我们引用的方法中匹配。所以我得到了下面的错误。

代码语言:javascript
复制
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

    }
}

既然我已经理解了为什么会出现这个错误,请看下面的代码片段

代码语言:javascript
复制
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()没有任何参数,在这种情况下,即使参数不匹配,它也不会抛出任何错误。

请帮助我理解这一点?

EN

Stack Overflow用户

发布于 2019-03-15 02:03:00

但Function的apply(T t)方法有一个参数,而getId()没有任何参数

apply函数接受一个参数作为一种类型的数据,并返回另一种类型的数据。在你的例子中,就好像是:

代码语言:javascript
复制
public Integer apply(Transaction transaction) {
    return transaction.getId();
}

当然,map操作中的完整Function将转换的输入和输出类型定义为:

代码语言:javascript
复制
new Function<Transaction, Integer>() {
    @Override
    public Integer apply(Transaction transaction) {
        return transaction.getId();
    }
}

相反,在您的代码中,m1需要向其提供整数类型的参数,这将导致void输出。因此,您的实现与Consumer相匹配,并且可以表示为:

代码语言:javascript
复制
Consumer<Integer> consumer = MethodRefTest::m1
票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55169178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档