有多种编程风格/范例,但是两种著名的风格是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