网站找图片做海报侵权,网站建设600分站优缺点,南充市租房子信息网,学生网站建设的心得有多种编程风格/范例#xff0c;但是两种著名的风格是Imperative和Functional 。 命令式编程是最主要的范例#xff0c;因为几乎所有主流语言#xff08;C #xff0c;Java#xff0c;C#xff03;#xff09;都在推广它。 但是在最近几年中#xff0c;函数式编程开始… 有多种编程风格/范例但是两种著名的风格是Imperative和Functional 。 命令式编程是最主要的范例因为几乎所有主流语言C JavaC都在推广它。 但是在最近几年中函数式编程开始受到关注。 主要驱动因素之一是仅所有新计算机都带有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