簡體   English   中英

用 Function 替換函數式接口

[英]Replace functional interface with Function

我對這段代碼有點困惑。 為什么不編譯?

@FunctionalInterface
public interface Inter {
  BigDecimal method (BigDecimal param);
}

public class Main {
  public static void main {
    Function<BigDecimal, BigDecimal> func = param -> BigDecimal.ZERO;
    Inter i1 = param -> BigDecimal.ZERO; // compile
    Inter i2 = func; // not compile
  }
}

查看包 java.util.function description

函數式接口為 lambda 表達式和方法引用提供目標類型。

這並不意味着函數接口是任意具體類變量的目標類型(例如Function<BigDecimal, BigDecimal>在您的情況下)。

要在需要特定功能接口( Inter )的上下文中使用Function<> (在您的情況下,在名為func的變量中),您可以簡單地將其設為 lambda 或方法引用:

Inter i2 = p -> func.apply(p);  // compiles

或者

Inter i2 = func::apply;

我可以在這里看到 2 個功能接口(SAM),第一個是 Inter,第二個是 FunctionalInterface,它由 java 提供,它代表一個接受一個參數並產生結果的函數。

看着Inter i2 = func; line ,您在這里嘗試做的是將一個功能接口分配給另一個功能接口,這在這里沒有任何意義。

我已經修改了您的代碼並引入了一個新的功能界面,希望這有助於消除您的疑問。

@FunctionalInterface
public interface Inter {
    BigDecimal method (BigDecimal param);
}

public static void main(String args[])
{
    Function<BigDecimal, BigDecimal> func = param -> BigDecimal.ZERO;

    Inter i1 = param -> BigDecimal.ZERO; // compile

    //creating new functional interface which returns Inter lambda body.
    Supplier<Inter> interSuppFuncInter = () -> { return param -> BigDecimal.ZERO; };

    Inter i2 = interSuppFuncInter.get(); // now compile's
    System.out.println(i2.method(BigDecimal.ZERO)); // invoke i2 lambda by calling its  method and passing the param
}

func是一個Function<BigDecimal, BigDecimal> ,它不是Inter的子接口。 因此它不能分配給Inter變量。

InterFunction<BigDecimal, BigDecimal>都是具有相同簽名方法的函數式接口這一事實並不重要,因為它們不相關。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM