2015-07-02 81 views
2

在Java 8中,函數可以駐留在包中而不需要定義類?Java 8功能和類

當你有一個功能時,似乎沒有必要上課。

我對Java很熟悉,但是對函數式編程來說很陌生。謝謝

回答

-1

排序,但函數不能像一個函數式編程語言一樣獨立於第一類公民。

在Java 8中,您可以將方法添加到接口或Enum。

public interface Loggable { 

    default Logger logger() { 
     return LoggerFactory.getLogger(this.getClass()); 
    } 
} 


public enum Level { 
    HIGH (3), 
    MEDIUM(2), 
    LOW (1) 

    private final int levelCode; 

    Level(int levelCode) { 
     this.levelCode = levelCode; 
    } 

    public int getLevelCode() { 
     return this.levelCode; 
    } 
} 

還有一個在爪哇8特殊註釋稱爲FunctionalInterface可用於創建一個功能接口,可在管線來實現,而不是一個類的成員。

如果您真的想在Java中進行函數式編程,因爲您希望避免在低級函數中維護狀態,那麼您可以始終使這些函數保持靜態,然後將該類視爲一個包。這樣你就不必做任何對象創建。

+0

謝謝你的解釋。 – jal

+0

@ user5073576 - 既然你是新來的,我會讓你知道你應該提出任何/所有對你發現的問題的答案。如果您認爲其中一個答案最好地解決了您的問題,您可以接受它是正確的,以便社區知道您的問題已解決。 – jeremyjjbrown

+0

@jeremyjjbrown:OP聲稱,當你有一個函數時,不需要類,但也不需要接口或枚舉(它本質上是一個類)。而且,如果沒有周圍的方法(或類,...),你也不能聲明lambda表達式。我的意思是說,Java不允許像例如相同的方式使用自由浮動函數C++的確如此。 –

0

編號Java沒有函數,只有屬於類的一部分的方法。

+0

「僅屬於類的一部分的方法」Java具有不屬於類的一部分的方法。 – jeremyjjbrown

+0

@jeremyjjbrown:好的,你能舉一個例子嗎? –

+0

我的答案中有一個例子。 – jeremyjjbrown

3

不,Java 8中的函數由功能接口表示。一個函數接口可以通過實現該接口的類來實現,通過實現該接口的單一方法的lambda表達式或通過方法引用來實現。在所有這些情況下,「功能」的實現都存在於某個類中。

+0

謝謝你的解釋。 – jal

+0

這個答案折扣了枚舉,這是一種定義沒有類的函數的方法。 – jeremyjjbrown

+0

@jeremyjjbrown枚舉也是類。 – Eran

1

你可以聲明一個final class,它不能實例化(使private構造函數),並把你的函數作爲這個類的靜態方法。您可以將此類視爲您的函數的「命名空間」。在不指定類名稱中使用他們,你可以導入靜態這個類:

import static com.example.mypackage.MyUtilityClass.*; 

這種方法被廣泛應用於許多Java庫和JDK(例如,java.lang.Math類)。