功能与命令式编程。 Java 8中的斐波那契,素数和阶乘
有多種編程風格/范例,但是兩種著名的風格是Imperative和Functional 。
命令式編程是最主要的范例,因為幾乎所有主流語言(C ++,Java,C#)都在推廣它。 但是在最近幾年中,函數式編程開始受到關注。 主要驅動因素之一是,僅所有新計算機都帶有4、8、16或更多核,并且以命令式方式編寫并行程序以利用所有核非常困難。 功能風格將這種困難轉移到了運行時級別,并使開發人員擺脫了繁瑣且容易出錯的工作。
等待! 那么這兩種樣式有什么區別。
命令式編程是一種范例,您可以在其中說明如何準確地執行機器/運行時語句以及應該執行哪些準確的語句以達到所需的結果。
函數式編程是聲明性編程范式的一種形式,您可以在其中聲明要實現的目標,而機器/運行時將確定最佳的實現方式。
功能風格將方式部分移至運行時級別,并幫助開發人員專注于哪一部分。 通過抽象如何部分我們可以寫出更好的可維護性和可擴展的軟件。
為了應對多核計算機帶來的挑戰并保持對開發人員的吸引力, Java 8引入了緊隨其后的功能范式。
有足夠的理論,讓我們使用Java來實現命令式和函數式編程中的幾個編程難題,然后看看它們之間的區別。
斐波那契數列命令式與功能性 (斐波那契數列是數字的序列:1、1、2、3、5、8、13、21、34,…。下一個數字是通過將前面的兩個數字相加而得出的。)
斐波那契數列的迭代式和命令式
public static int fibonacci(int number) {int fib1 = 1;int fib2 = 1;int fibonacci = fib1;for (int i = 2; i < number; i++) {fibonacci = fib1 + fib2;fib1 = fib2;fib2 = fibonacci;}return fibonacci; }for(int i = 1; i <= 10; i++) {System.out.print(fibonacci(i) +" "); } // Output: 1 1 2 3 5 8 13 21 34 55正如你可以在這里看到我們的重點是如何 (迭代狀態)很多,而這正是我們想要實現的。
斐波那契數列的迭代式和函數式
IntStream fibonacciStream = Stream.iterate(new int[]{1, 1},fib -> new int[] {fib[1], fib[0] + fib[1]}).mapToInt(fib -> fib[0]);fibonacciStream.limit(10).forEach(fib -> System.out.print(fib + " ")); // Output: 1 1 2 3 5 8 13 21 34 55相反,你可以在這里看到我們的重點是我們要達到的目標 。
質數命令式與功能性素數(質數是大于1的自然數,除1本身以外沒有正除數。)
命令式素數
public boolean isPrime(long number) { for(long i = 2; i <= Math.sqrt(number); i++) { if(number % i == 0) return false; } return number > 1; } isPrime(9220000000000000039L) // Output: true再次,我們在此重點關注如何 (迭代,狀態)。
功能風格的素數
public boolean isPrime(long number) { return number > 1 && LongStream.rangeClosed(2, (long) Math.sqrt(number)) .noneMatch(index -> number % index == 0); } isPrime(9220000000000000039L) // Output: true在這里我們再次的重點是我們要達到的目標 。 函數式樣式幫助我們抽象出了在數字范圍內進行顯式迭代的過程。
您現在可能會想,嗯,這就是我們所能擁有的一切……。 ? 讓我們看看如何以功能風格使用所有核心(獲得并行性)。
public boolean isPrime(long number) { return number > 1 && LongStream.rangeClosed(2, (long) Math.sqrt(number)).parallel() .noneMatch(index -> number % index == 0); } isPrime(9220000000000000039L) // Output: true而已! 我們只是將.parallel()添加到流中。 您可以看到庫/運行時如何為我們處理復雜性。
階乘命令式與函數式 (n的階乘是所有小于或等于n的正整數的乘積。)
迭代式和命令式的階乘
public long factorial(int n) {long product = 1;for ( int i = 1; i <= n; i++ ) {product *= i;}return product; } factorial(5) // Output: 120迭代和功能風格的階乘
public long factorial(int n) {return LongStream.rangeClosed(1, n).reduce((a, b) -> a * b).getAsLong(); } factorial(5) // Output: 120值得重申的是通過抽象如何部分我們可以寫出更好的可維護性和可擴展的軟件。
要查看Java 8引入的所有功能特性,請查看以下Lambda表達式,方法參考和流指南。
翻譯自: https://www.javacodegeeks.com/2015/12/functional-vs-imperative-programming-fibonacci-prime-factorial-java-8.html
總結
以上是生活随笔為你收集整理的功能与命令式编程。 Java 8中的斐波那契,素数和阶乘的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jetty 配置jndi_使用Jetty
- 下一篇: javaserver_集成Spring和