如何从静态函数返回函数接口?

Posted

技术标签:

【中文标题】如何从静态函数返回函数接口?【英文标题】:How to return a Function Interface from a static function? 【发布时间】:2021-12-21 20:58:14 【问题描述】:

我在预期返回值的静态方法中使用Function<String, String>

这接受一个输入并返回一个输出,如何从方法中返回值?

public static String getAnimalName(String name)

    Function<String, String> getNameFunc = (inputName)->
    
        return  inputName.equalsIgnoreCase("cat") ? "dog" : "rat";
    ;
    return "";

【问题讨论】:

更改您的函数以实际返回Function&lt;String, String&gt;,然后返回return getNameFunc(或return inputName -&gt; inputName.equalsIgnoreCase("cat") ? "dog" : "rat"; 当您只是返回 String 时,为什么还要使用 Function 我认为这个问题不需要结束 【参考方案1】:

你在做什么没有多大意义。您在函数内声明 Function&lt;String, String&gt;,但不使用它。另外我不确定你传递给函数的参数的目的是什么。

根据您的代码,我确定了三个有意义的变体,但根据您的问题标题,我假设您正在寻找解决方案 1。

    返回一个Function&lt;String, String&gt; 并从getAnimalNameFunction 中删除参数

    public static Function<String, String> getAnimalNameFunction() 
        Function<String, String> getNameFunc = (inputName) -> 
            return inputName.equalsIgnoreCase("cat") ? "dog" : "rat";
        ;
        return getNameFunc;
    
    

    然后在其他代码中..

    Function<String, String> nameConverter = getAnimalNameFunction();
    String name = nameConverter.apply("cow");
    

    保留参数,但返回Supplier&lt;String&gt;

    public static Supplier<String> getAnimalNameSupplier(String name) 
        Supplier<String> getNameSup = () -> 
            return name.equalsIgnoreCase("cat") ? "dog" : "rat";
        ;
        return getNameSup;
    
    

    然后在其他代码中..

    Supplier<String> nameGetter = getAnimalNameSupplier("cow");
    String name = nameGetter.get();
    

    返回一个String(就像你最初所做的那样)并删除中间的Function&lt;String, String&gt;

    public static String getAnimalName(String name)
    
        return name.equalsIgnoreCase("cat") ? "dog" : "rat";
    
    

    然后在其他代码中..

    String name = getAnimalName();
    

我不确定您尝试实现的三个中的哪一个,但我希望这能对问题有所了解。

【讨论】:

【参考方案2】:

接口java.util.function.Function 包含一个名为apply 的抽象方法。因此,您需要显式调用该方法。

lambda expression 是接口的实际实现。

public static String getAnimalName(String name) 
    Function<String, String> getNameFunc = (inputName) -> 
        return inputName.equalsIgnoreCase("cat") ? "dog" : "rat";
    ;
    return getNameFunc.apply(name);

请注意,您可以将 lambda 表达式简化为

Function<String, String> getNameFunc = inputName -> inputName.equalsIgnoreCase("cat") ? "dog" : "rat";

【讨论】:

在这种情况下,为什么首先要创建一个 Function 对象,而不是简单地将整个 getAnimalMethod 主体实现为 return name.equalsIgnoreCase("cat") ? "dog" : "rat"; @Abra 我觉得只是盲目地回答这个问题,而没有向 OP 暗示他们试图做的事情不是很明智,这违背了 SO 的精神

以上是关于如何从静态函数返回函数接口?的主要内容,如果未能解决你的问题,请参考以下文章

简单介绍如何使用PowerMock和Mockito来mock 1. 构造函数 2. 静态函数 3. 枚举实现的单例 4. 选择参数值做为函数的返回值(转)

为啥这些静态函数不按预期从另一个线程返回?

C -(malloc、calloc 或静态)从函数返回的 2d 字符数组

从静态函数返回对象数组

C# 静态构造函数

如何强制实现受保护的静态函数