Java 9在9月21日正式发布,同时Oracle宣布将Java新版本的发布周期调整为每半年一次。目前,Java新版本的开发也已正式进入轨道。就已公开的消息来看,下一个版本的Java预计会在2018年3月发布,版本号将会是18.3,已经规划加入的特性包括JEP 286和296。
根据reddit站点上的讨论,首先更新的是JEP 296,Valhalla预计很快也会加入进来。OpenJDK的主页面则显示,已确定要在18.3版本实现的是JEP 286和296。
JEP 296主要是将JDK仓库群(JDK Repository Forest)合并为一个仓库,旨在降低管理大量仓库群的成本。根据InfoQ之前的报道,该仓库群的合并已经完成。这些软件仓库是在OpenJDK发展史上历次分裂生成的,在OpenJDK 9及以前的版本中将会继续存在。在这次合并操作之前,OpenJDK曾分裂为多个不同的Mercurial软件仓库群,这导致了许多问题,例如不能以原子方式对多个软件仓库应用漏洞修复(Bug Fixes)。在OpenJDK合并完成后,只会有一个软件仓库,并复制在三个开发线上。为了简化仓库的管理,JDK中还创建了用于在合并和未合并版本间移动更改的工具。
JEP 286提议在Java中引入局部变量的类型推断,该JEP在2016年提出,InfoQ曾经报道过该JEP的概况和相关的开发者调查结果。该JEP旨在减少编写Java代码相关的仪式性的内容,提升开发人员的体验,同时还要保证Java语言的静态性。它会减少开发人员在声明局部变量时,没有必要的变量类型声明。如果该JEP实现的话,在声明局部变量的时候,就可以采用类似如下的方式:
var list = new ArrayList(); // infers ArrayList var stream = list.stream(); // infers Stream
这种语句只能用于带有初始化器(initializer)的局部变量、增强的for-loop中的索引以及传统for-loop中声明的局部变量。它不能用于方法声明、构造函数声明、方法返回值、字段、catch语句以及其他类型的变量声明中。
关于局部变量的类型推断,不管是JVM体系中的语言还是其他语言都提供了一定形式的支持,比如C++(auto)、C#(var)、Scala(var/val)以及Go(通过:=进行声明)。至于该使用var作为关键字,还是使用let或类似于C/C++中的auto作为关键字,之前曾经有过一个面向开发者的调查。大约84%的回答表明定义可变内容的变量用关键字var是恰当的,只有百分之几的回答者建议使用auto更合适。根据Java语言架构师Brian Goetz介绍,该功能应该使用关键词var。
关于该特性的用法,在reddit上有一些讨论。有人表示,即便在支持“auto”语法的语言中,该特性使用的也比较少,因为有些人希望一眼就能看出变量的类型是什么。也有人认为,var有它的适用空间,在小的代码块中,直接用它实例化对象是可以的。如果是作为方法返回值的话,还是希望明确声明类型,Java的类型推断并不支持方法返回值,这一点倒不必担心。如果函数或代码块比较长的话,就不建议使用var了并要考虑适时进行代码的重写。时间和经验将会让我们更加明确应该在何时使用新功能,就像Optional刚出现时,也是耗费了一些时间才明确其推荐适用场景。
Valhalla项目中包含了一些有趣的JEP,包括值类型(Value Type)、针对原始类型实现泛型功能、增强的volatile等,外界很期待这些内容最终也能添加到新版本中。
2017慧都十四周年狂欢搞事情!砸金蛋100%抽现金红包、满额豪送iPhone X、iPhone 8、DevExpress汉化免费送、团队升级培训套包劲省10万元......更多惊喜等您来探索!
VectorDraw File Converter是一个终端应用程序,使得用户能将常用的图像文件(DWG,DGN和DXF)转换为VectorDraw格式标准(VDF,VDI),反之亦然。该工具能将上述文件导出为SVG与DWF格式。VectorDraw File Converter还能进行多种文件的转换(比如*.dwg 到 *.vdf或者 *.dxf,反之亦然)。
VectorDraw File Converter更新至v7.7011.0.1,新版本针对提出的需求和bug做了调整和优化。
几行代码便可为应用程序添加E-Mail支持,简单高效。MailBee.NET Objects 是一款为创建、发送、接收以及处理电子邮件而设计的健壮、功能丰富的.NET控件。具备“必需”以及独特的功能,这些控件帮助开发人员简单快速地将复杂的电子邮件功能添加到他们的应用程序中。
MailBee.NET Objects 更新至v11.0,增加新的Ews组件、新的密钥格式并与Visual Studio 2017进行测试。
MailBee.NET Objects v11.0点击下载>>>
更新内容:
static void SimpleOCRCalculator(string filePath) { RasterCodecs codecs = new RasterCodecs(); RasterImage image = codecs.Load(filePath); string[] calculations; using (IOcrEngine engine = OcrEngineManager.CreateEngine(OcrEngineType.Advantage, false)) { engine.Startup(null, null, null, null); IOcrPage page = engine.CreatePage(image, OcrImageSharingMode.None); page.AutoZone(null); page.Recognize(null); calculations = new string[page.Zones.Count]; for (int i = 0; i < page.Zones.Count; i++) { calculations[i] = page.GetText(i); } engine.Shutdown(); } Dictionary<string, Action<double, double>> operands = new Dictionary<string, Action<double, double>>(); operands.Add("+", new Action<double, double>(delegate(double a, double b) { double ans = a + b; Console.WriteLine("{0} + {1} = {2}", a, b, ans); })); operands.Add("-", new Action<double, double>(delegate(double a, double b) { double ans = a - b; Console.WriteLine("{0} - {1} = {2}", a, b, ans); })); operands.Add("x", new Action<double, double>(delegate(double a, double b) { double ans = a * b; Console.WriteLine("{0} * {1} = {2}", a, b, ans); })); operands.Add("/", new Action<double, double>(delegate(double a, double b) { double ans = a / b; Console.WriteLine("{0} / {1} = {2}", a, b, ans); })); for (int i = 0; i < calculations.Length; i++) { string equation = Regex.Replace(calculations[i], @"\n|\r| ", ""); string[] ops = new string[] { "+", "-", "x", "/" }; for (int j = 0; j < ops.Length; j++) { int index = equation.IndexOf(ops[j]); if (index > 0 && index < equation.Length) { string op1 = equation.Substring(0, index); string op2 = equation.Substring(index + 1); double arg1 = double.Parse(op1); double arg2 = double.Parse(op2); operands[ops[j]](arg1, arg2); break; } } } codecs.Dispose(); image.Dispose(); }
微软本月重申,今年将发布两次Windows 10系统升级,这相当于2016年的两倍。但他们对公司的原定目标仍有顾虑。
在11天前澳大利亚举行的微软技术会议上项目管理主管比尔·卡拉古尼斯指出,后续升级将在“Creators Update”之后发布,此更新预计于下月完成并发货。
微软表示,这是Windows 10的发布计划复杂性的一个标志,也是微软的“Windows服务”总体战略。此外,在会议期间卡拉古尼斯还宣布了从去年开始测试的Windows升级分析服务将于3月1日全面开放。
Microsoft Office 365 商业版【在线订购】5套起订,享95折!
Microsoft Office 365 商业协作版【在线订购】5套起订,享95折!
Microsoft Office 365 商业高级版【在线订购】5套起订,享95折!
【文章来源慧都控件,原创不易,转载请注明出处】
1 2 3 | /* Property */ /* Scan pages in 200 DPI */ DWObject.Resolution = 200; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | // Method /// < summary > /// Rotates the image of a specified index in buffer by a specified angle. /// </ summary > /// < param name = "sImageIndex" type = "short" data-filtered = "filtered" > specifies the index of image in buffer. The index is 0-based. /// < param name = "fAngle" type = "float" data-filtered = "filtered" > specifies the angle. /// < param name = "bKeepSize" type = "bool" data-filtered = "filtered" > specifies whether to keep the original size /// < returns type = "bool" data-filtered = "filtered" ></ returns > DWObject.Rotate(0, 45, false); // rotate the 1st image in the buffer by 45 degrees |
1 2 3 4 5 6 7 8 9 10 11 12 13 | < script type = "text/javascript" data-filtered = "filtered" > Dynamsoft.WebTwainEnv.RegisterEvent('OnWebTwainReady', Dynamsoft_OnReady); var DWObject; /* OnWebTwainReady event fires as soon as Dynamic Web TWAIN is initialized and ready to be used. It is the best place to add event listeners */ function Dynamsoft_OnReady() { DWObject = Dynamsoft.WebTwainEnv.GetWebTwain('dwtcontrolContainer'); DWObject.RegisterEvent("OnPostTransfer", Dynamsoft_OnPostTransfer); } function Dynamsoft_OnPostTransfer() { /* This event OnPostTransfer will be triggered after a transfer ends. */ /* your code goes here*/ } </ script > |
1 2 3 4 5 6 7 8 9 10 | < script type = "text/javascript" data-filtered = "filtered" > Dynamsoft.WebTwainEnv.RegisterEvent('OnWebTwainReady', Dynamsoft_OnReady); var DWObject; function Dynamsoft_OnReady() { DWObject = Dynamsoft.WebTwainEnv.GetWebTwain('dwtcontrolContainer'); DWObject.RegisterEvent("OnPostTransfer", function() { /* your code goes here*/ }); } </ script > |
1 2 | /* sImageIndex is the index of the image you clicked on*/ OnMouseClick(short sImageIndex) |
1 2 3 | function DynamicWebTwain_OnMouseClick(index) { CurrentImage.value = index + 1; } |
1 2 3 | DWObject.RegisterEvent("OnPostTransfer", function(index) { CurrentImage.value = index + 1; }); |
1 2 3 4 5 6 7 | < script type = "text/javascript" data-filtered = "filtered" > Dynamsoft.WebTwainEnv.RegisterEvent('OnWebTwainReady', Dynamsoft_OnReady); var DWObject; function Dynamsoft_OnReady() { DWObject = Dynamsoft.WebTwainEnv.GetWebTwain('dwtcontrolContainer'); } </ script > |
1 2 3 4 5 | < script type = "text/javascript" data-filtered = "filtered" > Dynamsoft.WebTwainEnv.RegisterEvent('OnWebTwainReady', function() { DWObject = Dynamsoft.WebTwainEnv.GetWebTwain('dwtcontrolContainer'); }); </ script > |
本次教程到此结束,希望能对Dynamic Web TWAIN的用户带来帮助,接下来还会有更多的相关教程,敬请期待!
如今手机应用市场越来越大,其中创新、独特的产品也越来越多。APP市场最好的地方就是无论是iTunes还是Google Play中,你都有平等的机会参与竞争和获得成功。这是一个公平的竞争环境,吸引着无数优质的开发商。专家们已经预测,APP市场在2020年将翻一番,价值可以达到101亿美元。
无论你是一个多优秀的开发者,在开始新的APP应用时也应该注意一些事情。在启动一个APP项目时你应该记住和经过几个重要的步骤来确保它能成功。