佳能6D2为什么是佳能入门级单反推荐

在Java中应用函数式编程请小心! - ImportNew
这并不是要对令人畏惧的函数式编程进行谴责,而是对编程中很容易发生的一些错误进行警醒。
是函数式编程的关键,因此,谈论它们会帮助你在派对上成为关注的焦点。
如果你正在写 JavaScript ,实际上一直在做的就是高阶函数。例如:
setTimeout(function() {
alert('10 Seconds passed');
}, 10000);
上面的 setTimeout() 函数就是一个高阶函数。它的参数是一个匿名函数。10秒后,它将会用这个匿名函数作为参数来调用。
我们可以编写另一个简单的高阶函数,作为结果提供给上面的函数:
var message = function(text) {
return function() {
alert(text);
setTimeout(message('10 Seconds passed'), 10000);
如果运行上面的程序,将会执行message() 函数,并返回一个匿名函数,这个匿名函数将会输出传递给 message() 函数的text参数。
在函数式编程中,上面是很常见的做法。由高阶函数返回的函数被调用时,将会捕捉外部作用域,并且能够在这个作用域上进行操作。
为什么在 Java 中这种做法很危险?
出于同样的原因。高阶函数(方法)返回的函数(lambda函数)被调用的时候,会捕捉外部作用域,并且能够在这个作用域上进行操作。
这里给出一个最简单的例子:
class Test {
public static void main(String[] args) {
Runnable runnable = runnable();
runnable.run(); // Breakpoint here
static Runnable runnable() {
return () -& {
System.out.println(&Hello&);
在上面的逻辑中,如果在 runnable.run() 方法调用处做一个断点,可以看到在堆栈上无害的lambda实例。生成的一个简单类,提供了函数式接口的实现:
现在,把这个例子转换成普通的企业应用程序()。为了方便博客的书写,我们做了很大的简化:
class Test {
public static void main(String[] args) {
Runnable runnable = new EnterpriseBean()
.runnable();
runnable.run(); // Breakpoint here
@ImportantDeclaration
@NoMoreXML({
@CoolNewValidationStuff(&Annotations&),
@CoolNewValidationStuff(&Rock&)
class EnterpriseBean {
Object[] enterpriseStateObject =
new Object[100_000_000];
Runnable runnable() {
return () -& {
System.out.println(&Hello&);
断点仍放在原来的地方。那么我们在堆栈中又能看到什么呢?
仍然是一个无害的lambda实例:
好吧,为了调试,我们现在添加一些日志:
class Test {
public static void main(String[] args) {
Runnable runnable = new EnterpriseBean()
.runnable();
runnable.run(); // Breakpoint here
@ImportantDeclaration
@NoMoreXML({
@CoolNewValidationStuff(&Annotations&),
@CoolNewValidationStuff(&Rock&)
class EnterpriseBean {
Object[] enterpriseStateObject =
new Object[100_000_000];
Runnable runnable() {
return () -& {
// Some harmless debugging here
System.out.println(&Hello from: & + this);
意外地,一个毫无影响的 this 引用强迫Java 编译器封装返回的Runnable 类中 EnterpriseBean 的外部类实例:
而且,同时返回的还有 enterpriseStateObject 。这个对象现在不会被垃圾回收,直到调用点释放 Runnable后才会释放。
好吧,现在这并不是什么新鲜事,不是吗?
确实,这并不是什么新鲜事。Java 8 没有一流的函数,没关系。通过虚拟的 SAM 类型支持匿名表达式的想法就相当的巧妙,因为在 Java系统中它允许对所有现有的库更新和lambda-y-fy而并不改变它们。
而且,用一个匿名类,这整件事情就不会那么令人惊讶了。由于良好的Swing 1.0风格ActionListener等,下面的编码风格通过内部类已经暴露了内部的状态。
class Test {
public static void main(String[] args) {
Runnable runnable = new EnterpriseBean()
.runnable();
runnable.run();
@ImportantDeclaration
@NoMoreXML({
@CoolNewValidationStuff(&Annotations&),
@CoolNewValidationStuff(&Rock&)
class EnterpriseBean {
Object[] enterpriseStateObject =
new Object[100_000_000];
Runnable runnable() {
return new Runnable() {
public void run() {
System.out.println(&Hello from & + EnterpriseBean.this);
这里有什么心东西?匿名风格会鼓励在 Java 中所有地方使用高阶函数。一般情况下是挺好的。但是,仅仅当高阶函数是一个静态方法时,其产生的类型不会封装任何状态。
然而,通过上面的例子,我们可以看到,在不久的将来,当我们开始拥抱 Java 8 函数式编程风格时,我们在调试过程中将会时不时碰到一些内存泄露等问题。
所以,请谨慎使用并遵循以下规则:
(“Pure”) Higher order functions MUST be static methods in Java!
以前封闭实例(enclosing instance)会出现一些问题。可以解了一下可怕的在前20年是怎么给Java开发者带来痛苦和磨难的。
原文链接:
- 译文链接: [ 转载请保留原文出处、译者和译文链接。]
关于作者:
你这明显有问题,你这开辟了5个线程,每个线程都执行50万次操作,就等于=250000...
关于ImportNew
ImportNew 专注于 Java 技术分享。于日 11:11正式上线。是的,这是一个很特别的时刻 :)
ImportNew 由两个 Java 关键字 import 和 new 组成,意指:Java 开发者学习新知识的网站。 import 可认为是学习和吸收, new 则可认为是新知识、新技术圈子和新朋友……
新浪微博:
推荐微信号
反馈建议:@
广告与商务合作QQ:
– 好的话题、有启发的回复、值得信赖的圈子
– 写了文章?看干货?去头条!
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 活跃 & 专业的翻译小组
– 国内外的精选博客文章
– UI,网页,交互和用户体验
– JavaScript, HTML5, CSS
– 专注Android技术分享
– 专注iOS技术分享
– 专注Java技术分享
– 专注Python技术分享
& 2017 ImportNewjava中的类路径问题,导入的标准类不需要配置它的路径吗
import java.util.*;
public class HelloWorld
public static void main ( String [] args )
System.out.println ( &HelloWorld!& );
假如这个程序我存在D\java\目录下,并且在CLASSPATH变量里面把d:\加进去了,编译的时候会在同目录生成一个.class文件,这是对程序中 HelloWorld& 类编译的结果吧?可是程序中还导入了util包下的System类阿,那个类的位置我没有在CLASSPATH 里面设置阿,怎么也能运行呢?java程序中导入的标准类不需要配置CLASSPATH吗?
对于标准类库的引用,像上面的&java.io.*&,可以直接使用,也就是说它 不需要显示的放在系统的环境变量CLASSPATH中。
此问题已解决~
jdk/jre/lib 下的所有 jar 包会自动被 import
在rt.jar 里
引用来自“红薯”的答案jdk/jre/lib 下的所有 jar 包会自动被 import
就是说javac在编译一个源文件的时候发现文件里面import了java的标准类,就会自动地去相应的包里面找还是系统本身就把标准类编译好了放在lib下面,编译文件的时候直接用?还是到底怎么回事?又有点糊涂了~~
引用来自“流云诸葛”的答案引用来自“红薯”的答案jdk/jre/lib 下的所有 jar 包会自动被 import
就是说javac在编译一个源文件的时候发现文件里面import了java的标准类,就会自动地去相应的包里面找还是系统本身就把标准类编译好了放在lib下面,编译文件的时候直接用?还是到底怎么回事?又有点糊涂了~~再问大哥一个问题,import不是一般导入的是java.util.*;不是在java目录下的吗,怎么跑到jre/lib下面了?看书看到这块卡住了^^^
jar文件相当于一个zip文件,里面是很多.class文件的组合,而这些.class文件是按目录层次存放的,这个目录层次就是import 后面的.和.之间的包名了
比如我自己了一个类库,其中的工具类是MyTool,它在 org.my.utils包中,而我把它打包在mytool.jar文件中。那么你要使用的话,就要在CLASSPATH中包含mytool.jar, 并且在使用此类的类中,import org.my.utils.MyT
--- 共有 2 条评论 ---
晕,上面的兄弟是指“红薯”老大,是我的不对~~~
jdk/jre/lib下的所有jar包会自动放在CLASSPATH中,而不是自动被import,上面的兄弟表达可能有点偏差,但大致是这样。其实意思就是,在jdk/jre/lib下的所有jar文件中包含的package,是可以在程序直接import而不用对CLASSPATH作特殊处理
引用来自“szf”的答案jar文件相当于一个zip文件,里面是很多.class文件的组合,而这些.class文件是按目录层次存放的,这个目录层次就是import 后面的.和.之间的包名了
比如我自己了一个类库,其中的工具类是MyTool,它在 org.my.utils包中,而我把它打包在mytool.jar文件中。那么你要使用的话,就要在CLASSPATH中包含mytool.jar, 并且在使用此类的类中,import org.my.utils.MyT嗯,我直接一直查看的是src目录,后来把rt.jar解压之后看了看我就知道弄错了,那javac 编译碰到import的时候,比如说import com.horstmann.而corejava下面是一个.java文件,javac编译的时候就会把那个.java文件在同目录下编译出一个.class文件,然后使用import com...;的源文件才能编译成功,如果corejava下面是一个.class文件,就不会在同目录下编译出一个.class文件吧?请问是不是这样的?
还有,import不同于C里面的#include,不会被把个类或者包弄进某个程序,那它到底是干嘛用的,它的原理是什么呢?
引用来自“dd”的答案在rt.jar 里
嗯,我看到了~~谢谢
引用来自“流云诸葛”的答案引用来自“szf”的答案jar文件相当于一个zip文件,里面是很多.class文件的组合,而这些.class文件是按目录层次存放的,这个目录层次就是import 后面的.和.之间的包名了
比如我自己了一个类库,其中的工具类是MyTool,它在 org.my.utils包中,而我把它打包在mytool.jar文件中。那么你要使用的话,就要在CLASSPATH中包含mytool.jar, 并且在使用此类的类中,import org.my.utils.MyT嗯,我直接一直查看的是src目录,后来把rt.jar解压之后看了看我就知道弄错了,那javac 编译碰到import的时候,比如说import com.horstmann.而corejava下面是一个.java文件,javac编译的时候就会把那个.java文件在同目录下编译出一个.class文件,然后使用import com...;的源文件才能编译成功,如果corejava下面是一个.class文件,就不会在同目录下编译出一个.class文件吧?请问是不是这样的?
还有,import不同于C里面的#include,不会被把个类或者包弄进某个程序,那它到底是干嘛用的,它的原理是什么呢?import
在编译时告诉javacc:下面的代码使用了某某类,你找吧~
在运行时告诉JVM:这个class使用了某某类,你找吧~
javacc和java就按规定,去自己的CLASSPATH参数中指定的位置去找了,这些位置可以是jar文件,也可以是某目录.
至于#include 就是C编译器预处理时,把.h文件内容直接插入.c文件对应位置。
所以上面最大的差异是,#include的处理对象就是文件,是物理存在的东西;而import的处理对象是类定义,是逻辑的东西,这东西由jvm或javacc具体确定。
引用来自“szf”的答案引用来自“流云诸葛”的答案引用来自“szf”的答案jar文件相当于一个zip文件,里面是很多.class文件的组合,而这些.class文件是按目录层次存放的,这个目录层次就是import 后面的.和.之间的包名了
比如我自己了一个类库,其中的工具类是MyTool,它在 org.my.utils包中,而我把它打包在mytool.jar文件中。那么你要使用的话,就要在CLASSPATH中包含mytool.jar, 并且在使用此类的类中,import org.my.utils.MyT嗯,我直接一直查看的是src目录,后来把rt.jar解压之后看了看我就知道弄错了,那javac 编译碰到import的时候,比如说import com.horstmann.而corejava下面是一个.java文件,javac编译的时候就会把那个.java文件在同目录下编译出一个.class文件,然后使用import com...;的源文件才能编译成功,如果corejava下面是一个.class文件,就不会在同目录下编译出一个.class文件吧?请问是不是这样的?
还有,import不同于C里面的#include,不会被把个类或者包弄进某个程序,那它到底是干嘛用的,它的原理是什么呢?import
在编译时告诉javacc:下面的代码使用了某某类,你找吧~
在运行时告诉JVM:这个class使用了某某类,你找吧~
javacc和java就按规定,去自己的CLASSPATH参数中指定的位置去找了,这些位置可以是jar文件,也可以是某目录.
至于#include 就是C编译器预处理时,把.h文件内容直接插入.c文件对应位置。
所以上面最大的差异是,#include的处理对象就是文件,是物理存在的东西;而import的处理对象是类定义,是逻辑的东西,这东西由jvm或javacc具体确定。嗯是的~扫二维码下载作业帮
2亿+学生的选择
下载作业帮安装包
扫二维码下载作业帮
2亿+学生的选择
java 数学公式这种复杂的公式 在java里面怎么编,&需要在java里面 运用哪些数学方法?是一步一步算吗?不知道math类怎么用。
扫二维码下载作业帮
2亿+学生的选择
这个公式不复杂啊,统共就会用到Math里面的求次方的pow函数了。因为这个属于java.lang包下的,调用方法就是Math.pow(a,b),相当于a^b了。当然是一步一步算了,Java不是matlab,还不支持符号运算。double的精度应该够你用了,如果要用任意精度的运算,才考虑用java.math包下的BigDecimal,&BigInteger那些类,一般不需要。你的公式用java写,如下:double&&loanamount,&monthlyInterestRint&numOfY//上述变量的赋值&(略)double&result&=&(loanamount*monthlyInterestRate)/(1-1/Math.pow(1+monthlyInterestRate,&numOfYears*12));
为您推荐:
扫描下载二维码3238人阅读
&java中的数学函数
调用Java中的数学函数需要使用 import java.lang.Math.*
ceil(double)
返回不小于该参数的最小整数 (最接近负无穷)的 double 型值。
floor(double)
返回不大于该参数的最大整数 (最接近正无穷)的 double 型值。
IEEEremainder(double, double)
计算两个参数按照 IEEE 754 标准规定的求余运算。
pow(double, double)
返回参数一的参数二次方。random()返回 0.0 到 1.0
间的随机数。
rint(double)
返回与该参数最接近的整数。&
double toDegrees(double angrad)
Converts an angle measured in radians to an approximately
equivalent angle measured in
degrees.&&double toRadians(double
angdeg)&&&&&&&&&
Converts an angle measured in degrees to an approximately
equivalent angle measured in radians.
类别包括一些数字运算的方法。如指数、对数、开平方、三角函数等
Math 类别的数据域:
Double E = 2.0452354
Double PI = η
Math 类别的方法
Abs(double x):传回 x 的绝对值。X也可int long float
acos(double x):传回x值的反余弦函数值。
asin(double x):传回x值的反正弦函数值。
atan(double x):传回x值的反正切函数值。
atan2(double x, double y):传回极坐标(polar)的θ值
ceil(double x):传回不小于x的最小整数值。
cos(double x):传回x径度的余弦函数值
exp(double x):传回相当于ex值
floor(double x):传回不大于x的最大整数值
log(double x):传回x的自然对数函数值
max(double x,double y):传回x、y较大数
min(double x,double y):传回x、y较小数
pow(double x,double y):传回xy值
random():传回随机数值
rint(double x):传回最接近x的整数值
round(double x):传回x的四舍五入值
sin(double x): 传回x径度的正弦函数值
sqrt(double x): 传回x开平方值
tan(double x): 传回x径度的正切函数值
toDegrees(double angrad):传回将angrad径度转换成角度
toRadians(double angdeg): 传回将angdeg角度转换成径度
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:419492次
积分:5181
积分:5181
排名:第5066名
原创:30篇
转载:266篇
评论:48条
(2)(1)(1)(1)(5)(8)(1)(2)(3)(4)(4)(3)(6)(37)(8)(21)(38)(10)(5)(17)(17)(45)(24)(33)

我要回帖

更多关于 入门级单反尼康和佳能 的文章

 

随机推荐