-
人工智能技术的提升不仅为企业的运营带来了效率,而且为人民的生活带来了便利。迄今为止,人工智能已经实现了生物识别智能、自动驾驶汽车和人脸识别等等项目。 就像大多数软件应用程序的开发一样,开发人员也在使用多种语言来编写人工智能项目,但是现在还没有任何一种完美的编程语言是可以完全速配人工智能项目的。编程语言的选择往往取决于对人工智能应用程序的期望功能。关于最佳人工智能编程语言的争论从未停止,所以本文就来比较5种人工智能项目最常用的编程语言,并列出它们的优缺点。 Python 由于其语法,简单性和多功能性,Python成为开发人员最喜欢的人工智能开发编程语言。Python最打动人心的地方之一就是便携性,它可以在Linux、Windows、Mac OS和UNIX等平台上使用。允许用户创建交互式的、解释的、模块化的、动态的、可移植的和高级的代码。 另外,Python是一种多范式编程语言,支持面向对象,过程式和功能式编程风格。由于其简单的函数库和理想的结构,Python支持神经网络和NLP解决方案的开发。 优点 Python有丰富多样的库和工具。 支持算法测试,而无需实现它们。 Python的面向对象设计提高了程序员的生产力。 与Java和C ++相比,Python的开发速度更快。 缺点 习惯使用Python来编写人工智能程序的程序员很难适应其它语言的语法。 与c++和Java不同的是,Python需要在解释器的帮助下工作,这就会拖慢在AI开发中的编译和执行速度。 不适合移动计算。 C ++ 优点 c++是最快的计算机语言,如果你的人工智能项目对于时间特别敏感,那么C++是很好的选择,它提供更快的执行时间和更快的响应时间(这也是为什么它经常应用于搜索引擎和游戏)。此外,c++允许广泛使用算法,并且在使用统计人工智能技术方面是有效的。另一个重要的因素是c++支持在开发中重用代码。 C ++适用于机器学习和神经网络。 缺点 多任务处理不佳; C ++仅适用于实现特定系统或算法的核心或基础。 它遵循自下而上的方法,因此非常复杂。 Java Java也是一种多范式语言,遵循面向对象的原则和一次写入读取/随处运行(WORA)的原则。它是一种AI编程语言,可以在任何支持它的平台上运行,而无需重新编译。 在各种项目的开发中,Java都是常用语言之一,它不仅适用于NLP和搜索算法,还适用于神经网络。 Lisp 优点 Lisp是一门计算机编程语言,是继Fortran之后的第二古老的编程语言。随着时间的推移,LISP逐渐发展成为一种强大的、动态的编码语言。 有人认为Lisp是最好的人工智能编程语言,因为它为开发人员提供了自由。在人工智能中使用Lisp,因其灵活性可以快速进行原型设计和实验,当然这也反过来促进Lisp在AI开发中的发展,例如,Lisp有一个独特的宏系统,有助于开发和实现不同级别的智能。 与大多数人工智能编程语言不同,Lisp在解决特定问题时更加高效,因为它适应了开发人员编写解决方案的需求,非常适合于归纳逻辑项目和机器学习。 缺点 很少有开发人员熟悉Lisp编程。 作为一种较古老的编程语言,Lisp需要配置新的软件和硬件来适应它的使用。 Prolog Prolog也是古老的编程语言之一,与Lisp一样,它也是人工智能项目开发的常用语言,拥有灵活框架的机制,它是一种基于规则和声明性的语言,包含了决定其人工智能编码语言的事实和规则。 Prolog支持基本的机制,例如模式匹配、基于树的数据结构和人工智能编程的自动回溯。除了在人工智能项目中广泛使用外,Prolog还用于创建医疗系统。 本文转自:IT168网站
-
帮助中心 > OBS_JAVA_SDK > 开发指南 > 相关资源 > 示例工程 huawei-obs-java-sdk-demo.zip 无法添加的啊?
-
本帖最后由 Mercy 于 2018-3-27 10:33 编辑[code]import java.util.List; import java.util.stream.Collectors; import sun.misc.BASE64Encoder; import sun.misc.BASE64Decoder; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; import com.huawei.openstack4j.api.Builders; import com.huawei.openstack4j.api.OSClient.OSClientV3; import com.huawei.openstack4j.api.types.ServiceType; import com.huawei.openstack4j.core.transport.Config; import com.huawei.openstack4j.model.common.ActionResponse; import com.huawei.openstack4j.model.common.Identifier; import com.huawei.openstack4j.openstack.OSFactory; import com.huawei.openstack4j.openstack.identity.internal.OverridableEndpointURLResolver; import com.huawei.openstack4j.model.compute.Action; import com.huawei.openstack4j.model.compute.RebootType; import com.huawei.openstack4j.model.compute.Server; import com.huawei.openstack4j.model.compute.Server.Status; import com.huawei.openstack4j.model.compute.ServerCreate; import com.huawei.openstack4j.model.network.AttachInte**ceType; import com.huawei.openstack4j.model.network.Network; import com.huawei.openstack4j.model.network.Subnet; import com.huawei.openstack4j.model.network.Router; import com.huawei.openstack4j.model.network.RouterInte**ce; public class Demo_for_VPC { private static final String LANGUAGE = "zh-cn"; public static void main(String[] args) { // 第一步:填入华为云区域的endpoint,如下,对接华北区1就需要填入华北区服务的endpoint OverridableEndpointURLResolver endpointResolver = new OverridableEndpointURLResolver(); endpointResolver.addOverrideEndpoint(ServiceType.VOLUME_BACKUP, "https://vbs.cn-north-1.myhuaweicloud.com/v2/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.DNS, "https://dns.myhuaweicloud.com/v2"); endpointResolver.addOverrideEndpoint(ServiceType.AUTO_SCALING, "https://as.cn-north-1.myhuaweicloud.com/autoscaling-api/v1/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.CLOUD_EYE, "https://ces.cn-north-1.myhuaweicloud.com/V1.0/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.LOAD_BALANCER, "https://elb.cn-north-1.myhuaweicloud.com/v1.0/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.MAP_REDUCE, "https://mrs.cn-north-1.myhuaweicloud.com/v1.1/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.KEY_MANAGEMENT, "https://kms.cn-north-1.myhuaweicloud.com/v1.0/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.CLOUD_TRACE, "https://cts.cn-north-1.myhuaweicloud.com/v1.0/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.ANTI_DDOS, "https://antiddos.cn-north-1.myhuaweicloud.com/v1/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.Notification, "https://smn.cn-north-1.myhuaweicloud.com/v2/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.MessageQueue, "https://dms.cn-north-1.myhuaweicloud.com/v1.0/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.MAAS, "https://maas.cn-north-1.myhuaweicloud.com/v1/%(project_id)s/objectstorage"); endpointResolver.addOverrideEndpoint(ServiceType.DATABASE, "https://rds.cn-north-1.myhuaweicloud.com"); /* 第二步: 配置鉴权信息(以对接华北区为例) * user为用户名 * projectId为华为云控制台-账户中心-基本信息-管理我的凭证-项目列表中华北区的项目ID * userDomainId为华为云控制台-账户中心-基本信息-管理我的凭证的账户ID * authURL为IAM服务华北区的域名 */ String user = "wanglianmin-guest"; String password = "XXXXXX"; String projectId = "74610f3a5ad941998e91f076297ecf27"; String userDomainId = "2aa29cbca17a4822abd096610e378ffa"; String authUrl = "https://iam.cn-north-1.myhuaweicloud.com/v3"; // 第三步: 初始化一个连接 OSFactory.enableHttpLoggingFilter(true); //调试用,可以显示request body和response body Config config = Config.newConfig().withEndpointURLResolver(endpointResolver).withLanguage(LANGUAGE) .withSSLVerificationDisabled(); OSClientV3 osclient = OSFactory.builderV3().withConfig(config).endpoint(authUrl) .credentials(user, password, Identifier.byId(userDomainId)).scopeToDomain(Identifier.byId(userDomainId)) .scopeToProject(Identifier.byId(projectId)).authenticate(); //创建router Router router = osclient.networking().router().create(Builders.router() .name("javaSDK-router-test") .build()); // 创建network,DNSNameServer参数请在官网页面创建subnet后获取默认值,各个region(比如华北区、华东区)不一样 Network network = osclient.networking().network() .create(Builders.network().name("javaSDK-net-test") .adminStateUp(true).build()) ; Subnet subnet = osclient.networking().subnet() .create(Builders.subnet().name("javaSDK-subnet-test") .networkId(network.getId()).cidr("192.168.45.0/24") .gateway("192.168.45.1").addDNSNameServer("100.125.1.250") .addDNSNameServer("114.114.114.114").enableDHCP(true).build()) ; System.out.println(subnet); // 将子网添加到router上 RouterInte**ce routerinf = osclient.networking().router() .attachInte**ce(router.getId(), AttachInte**ceType.SUBNET, subnet.getId()); // 删除上面所有资源 osclient.networking().router().detachInte**ce(router.getId(), subnet.getId(),routerinf.getPortId()); osclient.networking().subnet().delete(subnet.getId()); osclient.networking().network().delete(network.getId()); osclient.networking().router().delete(router.getId()); } } [/code]
-
本帖最后由 Mercy 于 2018-3-27 10:29 编辑下面是Java SDK中批量操作云服务器的示例 [code]import java.util.List; import java.util.stream.Collectors; import sun.misc.BASE64Encoder; import sun.misc.BASE64Decoder; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; import com.huawei.openstack4j.api.Builders; import com.huawei.openstack4j.api.OSClient.OSClientV3; import com.huawei.openstack4j.api.types.ServiceType; import com.huawei.openstack4j.core.transport.Config; import com.huawei.openstack4j.model.common.ActionResponse; import com.huawei.openstack4j.model.common.Identifier; import com.huawei.openstack4j.openstack.OSFactory; import com.huawei.openstack4j.openstack.identity.internal.OverridableEndpointURLResolver; import com.huawei.openstack4j.model.compute.Action; import com.huawei.openstack4j.model.compute.RebootType; import com.huawei.openstack4j.model.compute.Server; import com.huawei.openstack4j.model.compute.Server.Status; import com.huawei.openstack4j.model.compute.ServerCreate; import com.huawei.openstack4j.model.compute.StopType; import com.huawei.openstack4j.openstack.loadbalance.domain.AsyncJob; public class Demo_for_ECS_batch { private static final String LANGUAGE = "zh-cn"; // 封装查询Job函数,返回失败子任务的ECS列表 public static ArrayList waitforJob(OSClientV3 osclient, String jobId, int TIMES, int interval) throws InterruptedException { for(int i=1;i=TIMES;i++) { Thread.sleep(interval*1000); AsyncJob Job = osclient.loadBalancer().jobs().get(jobId); if(Job.getStatus() == AsyncJob.Status.SUCCESS) { System.out.println("job success after " + i + " tries"); break; }else if(Job.getStatus() == AsyncJob.Status.FAIL){ System.out.println("job failed after " + i + " tries"); break; }else { continue; } } // 获取失败子任务列表 AsyncJob Job = osclient.loadBalancer().jobs().get(jobId); // 获取Job Object sub_jobs_obj = Job.getEntities().get("sub_jobs"); // 获取Job中的子任务列表 @SuppressWarnings("unchecked") List> sub_jobs_list = (List>)sub_jobs_obj; // 将子任务列表从Object转换为List ArrayList failed_serverIds = new ArrayList(); // 初始化失败子任务的server列表 for(Map sub_job : sub_jobs_list ) { Object entities = sub_job.get("entities"); // 获取子任务的entities,里面包含子任务对象 @SuppressWarnings("unchecked") Map entities_map = (Map)entities; if(!"SUCCESS".equals(sub_job.get("status"))) { System.out.println("status of sub job is " + sub_job.get("status")); failed_serverIds.add(entities_map.get("server_id")); // 获取成功失败子任务的虚拟机uuid } } return failed_serverIds; } public static void main(String[] args) throws InterruptedException { // 第一步:填入华为云区域的endpoint,如下,对接华北区1就需要填入华北区服务的endpoint OverridableEndpointURLResolver endpointResolver = new OverridableEndpointURLResolver(); endpointResolver.addOverrideEndpoint(ServiceType.VOLUME_BACKUP, "https://vbs.cn-north-1.myhuaweicloud.com/v2/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.DNS, "https://dns.myhuaweicloud.com/v2"); endpointResolver.addOverrideEndpoint(ServiceType.AUTO_SCALING, "https://as.cn-north-1.myhuaweicloud.com/autoscaling-api/v1/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.CLOUD_EYE, "https://ces.cn-north-1.myhuaweicloud.com/V1.0/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.LOAD_BALANCER, "https://elb.cn-north-1.myhuaweicloud.com/v1.0/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.MAP_REDUCE, "https://mrs.cn-north-1.myhuaweicloud.com/v1.1/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.KEY_MANAGEMENT, "https://kms.cn-north-1.myhuaweicloud.com/v1.0/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.CLOUD_TRACE, "https://cts.cn-north-1.myhuaweicloud.com/v1.0/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.ANTI_DDOS, "https://antiddos.cn-north-1.myhuaweicloud.com/v1/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.Notification, "https://smn.cn-north-1.myhuaweicloud.com/v2/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.MessageQueue, "https://dms.cn-north-1.myhuaweicloud.com/v1.0/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.MAAS, "https://maas.cn-north-1.myhuaweicloud.com/v1/%(project_id)s/objectstorage"); endpointResolver.addOverrideEndpoint(ServiceType.DATABASE, "https://rds.cn-north-1.myhuaweicloud.com"); /* 第二步: 配置鉴权信息(以对接华北区为例) * user为用户名 * projectId为华为云控制台-账户中心-基本信息-管理我的凭证-项目列表中华北区的项目ID * userDomainId为华为云控制台-账户中心-基本信息-管理我的凭证的账户ID * authURL为IAM服务华北区的域名 */ String user = "wanglianmin-guest"; String password = "XXXXXX"; String projectId = "74610f3a5ad941998e91f076297ecf27"; String userDomainId = "2aa29cbca17a4822abd096610e378ffa"; String authUrl = "https://iam.cn-north-1.myhuaweicloud.com/v3"; // 第三步: 初始化一个连接 OSFactory.enableHttpLoggingFilter(true); //调试用,可以显示request body和response body,正式使用时请注释掉此行 Config config = Config.newConfig().withEndpointURLResolver(endpointResolver).withLanguage(LANGUAGE) .withSSLVerificationDisabled(); OSClientV3 osclient = OSFactory.builderV3().withConfig(config).endpoint(authUrl) .credentials(user, password, Identifier.byId(userDomainId)).scopeToDomain(Identifier.byId(userDomainId)) .scopeToProject(Identifier.byId(projectId)).authenticate(); // 批量创建虚拟机,填入所需参数;停止、启动、重启、删除虚拟机 String imageId = "e377c242-d74b-4e06-a0a4-2e25b8e7eef0"; String flavorId = "s2.small.1"; String networkId = "ef039b60-6a14-42d1-963b-687b627fea08"; // 创建Linux密码虚拟机,目前密码使用user-data参数传入,将来会统一使用adminPass参数 String userData_org = "#!/bin/bash \r\n echo ´root:P@ssWr0d123´ | chpasswd ;"; byte[] userData_byte = userData_org.getBytes(); String userData = new BASE64Encoder().encode(userData_byte); // generate networkList ArrayList networkList = new ArrayList(); networkList.add(networkId); // generate server body ServerCreate sc_Linux = Builders.server() .name("zt-Linux-test-sdk").flavor(flavorId) .min(50).max(50).image(imageId) .availabilityZone("cn-north-1b") .userData(userData) .networks(networkList).build(); System.out.println("New Server body " + sc_Linux); Server newServer = osclient.compute().servers().boot(sc_Linux); osclient.compute().servers().waitForServerStatus(newServer.getId(), Status.ACTIVE, 10, TimeUnit.MINUTES); // 过滤查询弹性云服务器列表,等待所有ECS状态为ACTIVE Map filter_name = new HashMap(); filter_name.put("name", "zt-Linux-test-sdk"); List? extends Server> servers = osclient.compute().servers().list(filter_name); ArrayList serverIds = new ArrayList(); for (Server server : servers) { osclient.compute().servers().waitForServerStatus(server.getId(), Status.ACTIVE, 3, TimeUnit.MINUTES); serverIds.add(server.getId()); } // 批量重启虚拟机,等待Job执行成功,请根据业务需要调整TIMES、interval参数 String rebootJobId = osclient.compute().serversV1().reboot(serverIds, RebootType.SOFT); ArrayList reboot_failed_serverIds = waitforJob(osclient, rebootJobId, 18, 10); System.out.println("List of reboot failed servers " + reboot_failed_serverIds); // 批量停止虚拟机,等待Job执行成功,请根据业务需要调整TIMES、interval参数 String stopJobId = osclient.compute().serversV1().stop(serverIds, StopType.SOFT); ArrayList stop_failed_serverIds = waitforJob(osclient, stopJobId, 18, 10); System.out.println("List of stop failed servers " + stop_failed_serverIds); if(stop_failed_serverIds.isEmpty()) { System.out.println("batch stop server success, jobId = " + stopJobId); }else { String stopJobId_sec = osclient.compute().serversV1().stop(stop_failed_serverIds, StopType.SOFT); ArrayList stop_failed_serverIds_sec = waitforJob(osclient, stopJobId_sec, 18, 10); System.out.println("Second List of stop failed servers " + stop_failed_serverIds_sec); } // 批量启动虚拟机,等待Job执行成功,请根据业务需要调整TIMES、interval参数 String startJobId = osclient.compute().serversV1().start(serverIds); ArrayList start_failed_serverIds = waitforJob(osclient, startJobId, 18, 10); System.out.println("List of start failed servers " + start_failed_serverIds); // 批量删除虚拟机,等待Job执行成功,请根据业务需要调整TIMES、interval参数 String deleteJobId = osclient.compute().serversV1().delete(serverIds, false, false); ArrayList delete_failed_serverIds = waitforJob(osclient, deleteJobId, 18, 10); System.out.println("List of delete failed servers " + delete_failed_serverIds); } } [/code]
-
目前java-chassis可以在Handler中通过Invocation获取到调用必要的信息,从而完成打点治理等。在和第三方对接或者做认证鉴权的时候,需要在handler获取HTTP header,如果这些header信息在REST接口没声明,那么Handler就无法获取到。
-
1、Java9新特性之---目录结构 包含jdk8及以前的jdk版本,所有目录结构以及目录含义如图: 1116611167jdk9之后,目录结构发生变化如图: 11168这个新特性只要了解下就可以了,这个目录结构是方便为了接下来新特性做保证 2、Java9新特性之---JShell工具 怎么理解,怎么用呢?这个只是针对于java9来说,相当于cmd工具,你可以和cmd一样,直接写方法等等,不过我认为只是适用于初学者做一些最简单的运算和写一些方法: 在cmd中打开这个工具: 11169进入工具后可以做一些简单的java操作 11170。。。。等等,我认为只适用于初学者学习java不用其他编辑工具就可以学习java 3、Java9新特性之---模块化 一个大型的项目,比如淘宝商城等,都会包含多个模块,比如订单模块,前台模块,后台管理模块,广告位模块,会员模块.....等等,各个模块之间会相互调用,不过这种情况下会很少,只针对特殊情况,如果一个项目有30个模块系统进行开发,但是只要某个单独模块运行时,都会带动所有的模块,这样对于jvm来说在内存和性能上会很低,所以,java9提供了这一个特性,某一个模块运行的时候,jvm只会启动和它有依赖的模块,并不会加载所有的模块到内存中,这样性能大大的提高了。写法上如下: 11171一个项目中的两个模块,模块之间通过module-info.java来关联,在IDEA编辑器右键创建package-info.java 11172在这个两个模块java9Demo和java9Test中,java9demo编写一个实体类Person,在java9Test调用这样一个过程 这个是java9Demo 将 java9Test 模块需要的文件导出 exports 把它所在的包导出 11179然后在java9Test模块中创建一个package-info.java,引入java9Demo模块导出包名 11188这样就可以直接在java9Test中引入Person实体类了,这只是一个简单的例子。exports 控制着那些包可以被模块访问,所以不被导出的包不能被其他模块访问
-
主要是对于笔者这几年编程实践中,学习各个语言的过程中总结出来的共通的知识要点与体系结构的反馈。具体的 Java、JavaScript、Python、Go 的学习笔记可以参考 Domain-of-ProgrammingLanguage 与 Web 开发基础与工程实践;本文归纳的层次结构可以帮助初学者厘清语言中的知识组织,并且也可以作为个人笔记的目录结构。 因图片太大,需要查看原图的用户可回帖后点击附件下载。 [hide]11125[/hide]
-
[*]直播回放:http://www.itdks.com/liveevent/detail/10012 [*]直播材料下载:https://github.com/apache/incubator-servicecomb-website/raw/master/assets/slides/20180208/Communications_Inside_Java_Chassis.pdf [*]互动环节获得激励名单: > flyingyizi > Jasonf6gp > ...msaq > 大王叫我巡山 > ayalei [*]大师风采: 11014 所有教程预告+材料汇总请移步:干货别错过!每周专家大咖直播+教程汇总{:9_88:}
-
Java 平台首席架构师 Mark Reinhold 近日在邮件列表上表示,按计划,JDK 10 将于 2 月 8 日星期四进入候选发布(Release Candidate)阶段。他建议 JDK 10 在该阶段采用和 JDK 9 相同的发布流程,将 Bug 修复分为 P1 - P5 五个不同的级别。候选阶段将重点修复那些能直接影响 JDK 10 能否成功发行的 P1 级错误,并将那些非关键或短期内无法解决的 P1 级错误推迟处理。此外,所有 P2 - P5 级的错误均留给后续版本修复。 JDK 10 的十二项新特性已确定,包括: JEP 286: 局部变量的类型推导。该特性在社区讨论了很久并做了调查,可查看 JEP 286 调查结果。 JEP 296: 将 JDK 的多个代码仓库合并到一个储存库中。 JEP 304: 垃圾收集器接口。通过引入一个干净的垃圾收集器(GC)接口,改善不同垃圾收集器的源码隔离性。 JEP 307: 向 G1 引入并行 Full GC。 JEP 310: 应用类数据共享。为改善启动和占用空间,在现有的类数据共享(“CDS”)功能上再次拓展,以允许应用类放置在共享存档中。 JEP 312: 线程局部管控。允许停止单个线程,而不是只能启用或停止所有线程。 JEP 313: 移除 Native-Header Generation Tool (javah) JEP 314: 额外的 Unicode 语言标签扩展。包括:cu (货币类型)、fw (每周第一天为星期几)、rg (区域覆盖)、tz (时区) 等。 JEP 316: 在备用内存设备上分配堆内存。允许 HotSpot 虚拟机在备用内存设备上分配 Java 对象堆。 JEP 317: 基于 Java 的 JIT 编译器(试验版本)。 JEP 319: 根证书。开源 Java SE Root CA 程序中的根证书。 JEP 322: 基于时间的版本发布模式。“Feature releases” 版本将包含新特性,“Update releases” 版本仅修复 Bug 。 此外,JDK 11 的页面已经出现了四个 JEP ,包括:动态类文件常量(JEP 309,Dynamic Class-File Constants)、低开销垃圾收集器 Epsilon(JEP 318)、移除 Java EE 和 CORBA 模块(JEP 320),以及 Lambda 参数的本地变量语法(JEP 323)。JDK 11 计划于 2018 年 9 月发布,并有望成为新的 LTS 版本。
-
本帖最后由 李白云 于 2018-2-5 10:35 编辑10420 参与方式: 1 扫上图二维**名 ,并于周四晚 20:00 扫码观看 2 PC端通过网页报名和观看: http://www.itdks.com/liveevent/detail/10012 所有教程预告+材料汇总请移步:干货别错过!每周专家大咖直播+教程汇总 每周更新!{:4_87:}
-
本帖最后由 DevCloud 于 2018-3-13 16:09 编辑本文将向大家演示如何在JavaWeb项目中集成Springfox-Swagger-UI。 一.相关信息 Swagger-UI简介10367 Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步。 Swagger UI是纯static的web程序,仅仅在页面加载的时候,调用http连接,获取yaml字符串或者json字符串, 将yaml文件和放到静态项目中,直观的显示接口信息。 二.集成步骤示例 1.添加SpringFox-Swagger的相关依赖 在项目中添加SpringFox-Swagger依赖,只需要在项目的pom.xml中添加如下代码即可: 10368其中jackson-databind是负责Json和Java对象之间的转化,SpringFox是负责swagger接口显示。 2.引入swagger相关Jar包文件 找到项目的springMvc.xml,在项目中引入swagger相关资源,代码操作如下: 10369 3.创建swaggerConfig文件 经过上述两步操作,我们已经可以使用swagger的相关注解。这时候,我们需要定义一个Config.java文件,这个文件的作用是定义接口页面(Swagger-ui.html)的一些重要信息。 10370上图两处红框位置,第一个红框:@注解来启用Swagger2。第二个红框: swagger-ui页面,导出json文件的地址。 定义好的Config.java文件也要添加到SpringMvc中(扫描到即可)。 4.添加@Api注解 经过上述三步操作,swagger-ui.html页面已经可以显示一些信息,但是因为我们没有通过Swagger指定接口,Swagger-ui.html页面是空白的。 想要显示接口信息,我们还要借助@Api以及其他以@Api开头的注解。 10371 @RestController表示Controller的返回方式 ,@RequestMapping 表示该Controller的请求路径,@Api 表示 这个接口在Swagger-ui中的请求路径Tags 中文名称。 前两个注解是ssm项目基本具备的,集成Swagger只需要添加@Api注解。 我们还给这个Controller中的每个方法增加了@ApiOperation注解。@RequestMapping中的method代表这个接口的请求类型,共四类:Get、post、put、delete@ApiOperation是对这个接口的描述:Value值是接口在swagger-ui中显示的信息。@ApiResponses 代表对返回值的处理。如图:如果返回405 提示:参数错误,返回其他,沿用系统默认提示。 至此,SpringFox-Swagger就集成成功了。 三.从项目中导出json项目部署成功后,在验证路径后面加上/swagger-ui.html 即可访问项目的swagger-ui( 114.115.137.228 是云主机地址)。在swagger-ui中可以看到各接口的详细信息。右键“右键另存为json”,保存链接即可获得接口测试的脚本模板。 10372
-
编程语言有上千种,但是流行的不过10来种,那些我们经常使用的编程语言都是谁在什么时候创造出来的呢?Casper Beyer 为我们进行了整理。 98151800年 Joseph Marie Jacquard 教会了一台织布机读穿孔卡片,制造出了第一个高度多线程的处理单元。他的发明受到了预见天网(Skynet)诞生的纺织工人的强烈反对。 1842年 Ada Lovelace(英国诗人拜伦之女)为计算程序拟定“算法”,写作的第一份“程序设计流程图”,被珍视为“第一位给计算机写程序的人”。稍微有点不便的是当时还没有计算机呢。 1936年 阿兰·图灵被称为计算机科学之父,人工智能之父。但英国法庭却并不认可,还判处对他进行化学阉割。 女皇后来宽恕了他,但不幸的是当时他已经过世很久了。 1936年 Alonzo Church(算法理论重要奠基人)发明了lambda算子,跟图灵生活在同样的时代,但是他在时代的另一边,也并没有被女王阉割。 1957年 John Backus创建了FORTRAN语言,这真正是程序员使用的第一种语言。 1959年 Grace Hopper发明了第一门针对企业面向商业的编程语言,并且把这门语言叫做“面向商业的通用语言(common business-oriented language)”,简称COBOL。 1964年 John Kemeny 和 Thomas Kurtz 认为编程太难了,需要回归本源,他们把自己的编程语言叫做BASIC。 1970年 Niklaus Wirth开发了多种语言,最后流行起来的是PASCAL。他喜欢开发语言。 他还发明了让摩尔定律变得过时的Wirth定律(软件变慢的速度比硬件变快的速度更快),因为软件开发者会编写出连大型主机也没法跟上的臃肿软件。 这在后来被证明是正确的——在Electron.js被发明出来后 1972年 Dennis Ritchie在贝尔实验室上班上到无聊了,于是他决定写出带有花括号的C语言,这门语言取得了巨大成功。随后他又增加了分段错误等对开发者友好的功能来辅助提高生产率。 折腾完这门语言之后他还有时间,于是他跟在贝尔实验室的伙计决定给C语言做个演示程序,结果他们弄出了一个操作系统,UNIX。 1980年 Alan Kay发明了一门面向对象语言,他把这门语言叫做Small**,在Small**中一切都是对象,甚至一个对象也是对象。没人真正搞得清楚small **是什么意思。 1983年 Jean Ichbiah注意到Ada Lovelace的程序从来都没有实际运行过,决定以她的名字开发一门语言,但是这门语言还是没有跑起来。 1983年 Bjarne Stroustrup 注意到C在编译方面花的时间还不够多,于是他把自己能想到的每一项功能都增加了进去,然后称之为C++。 每一个地方的程序员都接受了它,因为这样他们在工作的时候找借口看阿猫阿狗视频和xkcd漫画就显得比较有诚意了。 1986年 Brac Box 和 Tol Move决定在Small**的基础上制作一个C语言的不可读版本,他们把这门语言叫做Objective-C,但是没人弄得清楚它的语法。 1987年 Larry Wall有宗教经验,他成为了一名牧师,并且把Perl变成了一种教义。 1991年 Guido van Rossum不喜欢花括号,于是他发明了Python,语法选择的灵感来源自Monty Python(巨蟒剧团)和Flying Circus(飞行马戏团)。 1993年 Roberto Ierusalimschy和他的朋友认为自己需要一个巴西本地化的脚本语言,在本地化期间发生了一个错误,这个错误会把指针从1而不是0开始计算,他们把这门语言叫做Lua。 1994年 Rasmus Lerdorf给他个人主页的CGI脚本做了一个模板引擎,后来他把自己的资料都放到了网上。 世界决定将这些东西用到一切,Rasmus于是匆忙地将一些数据库绑定做了进去,并把这门语言叫做PHP。 1995年 Yukihiro Matsumoto不是很高兴,因为他注意到其他程序员不是很高兴。他创建了Ruby来让程序员高兴。在他创建了Ruby后“Matz”高兴了,Ruby社区高兴了,每个人都高兴了。 1995年 Brendan Eich利用周末时间设计了一门语言,打算用这门语言来为全世界的每一个主流浏览器乃至于最终的Skynet都提供动力。 他先是找到了Netscape然后说这门语言叫做LiveScript,但在代码评审期间Java变得流行起来,所以他们决定最好还是用花括号,然后就把它更名为JavaScript。 结果表明,Java却是一个会让他们惹上麻烦的商标,JavaScript随后更名为ECMAScript,但大家还是把它叫做JavaScript。 1996年 James Gosling发明了Java,第一们真正过于繁琐的面向对象语言,在这里设计模式完全压倒了实用主义。 于是就诞生了超级有效的管理器提供商、容器提供商、服务提供商、单一管理器提供商模式。 2001年 Anders Hejlsberg重新发明了Java然后把它叫做C#,因为用C来编程感觉要比Java酷。每个人都喜欢这个新版本的Java,因为它完全不像Java。 2005年 David Hanselmeyer Hansen创建了一个web框架叫做Ruby on Rails,从此大家不再记得Ruby和Rails是两个独立的东西了。 2006年 John Resig为JavaScript写了一个帮助库,每个人都以为那是一门语言,从此从互联网上拷贝粘贴jQuery代码就成为了一门职业。 2009年 Ken Thompson 和 Rob Pike 决定做一门类似C那样的语言,但要有更安全的装置,还要有更好的卖相,并且把Gopher(囊鼠)作为吉祥物。 他们把这门语言成为Go,并把它做成开源然后另外卖Gopher商标的护膝和头盔作为收入来源。 2010年 Graydon Hoare也想把语言做成C那样,他称之为Rust。每个人都要求马上用Rust把软件的每一块都重写一遍。Graydon希望做点更有亮点的事情,于是开始为苹果开发Swift。 2012年 Anders Hjelsberg希望在web浏览器里面写C#,于是他设计出TypeScript,这东西其实是JavaScript,但里面有了更多的Java的东西。 2013年 Jeremy Ashkenas想要像Ruby开发者一样快乐,于是他创建了CoffeeScript,这东西编译后像JavaScript但是样子又更像Ruby。Jerry从来都没有变得像Matz和Ruby开发者那样真正快乐。 2014年 Chris Lattner做Swift的时候,其主要的设计目标就是不要成为Objective-C,最后它看起来像Java。
-
前提条件1. 已经获取相关API文档。 登录华为云官网 http://support.huaweicloud.com 查看各个云服务的接口参考文档。 通过这些文档,可以学习云平台所支持的API参数。2. 获取Java SDK(jar包)及其介绍文档 登录以下网站获取Python OpenStack SDK 的官方文档: http://developer.huaweicloud.com/dev/sdk?all3. 获取华为云IAM鉴权信息和endpoint信息。 projectId/userDomainId参数获取方法见: http://forum.huaweicloud.com/forum.php?mod=viewthread&tid=1813 endpoint/AZ信息见: http://developer.huaweicloud.com/endpoint.html4. 开发环境已经安装好JDK 1.85. 欲了解Java SDK项目的源代码,请访问如下地址。 https://github.com/huawei/openstack4jJava代码示例DNS服务的简单Demo:创建zone、查询zone、删除zonepackage openstack4jdemo;import java.util.List;import com.huawei.openstack4j.core.transport.ProxyHost;import com.huawei.openstack4j.api.OSClient.OSClientV3;import com.huawei.openstack4j.api.types.ServiceType;import com.huawei.openstack4j.core.transport.Config;import com.huawei.openstack4j.model.common.Identifier;import com.huawei.openstack4j.model.dns.v2.Zone;import com.huawei.openstack4j.openstack.OSFactory;import com.huawei.openstack4j.openstack.dns.v2.domain.DesignateZone;import com.huawei.openstack4j.openstack.identity.internal.OverridableEndpointURLResolver;public class dns_test { private static final String LANGUAGE = "zh-cn"; public static void main(String[] args) { // step 1: add cloud service override endpoint 注意:示例中endpoint都使用华北区的,如果需要在华南区操作资源,需要相应修改为华南区的endpoint OverridableEndpointURLResolver endpointResolver = new OverridableEndpointURLResolver(); endpointResolver.addOverrideEndpoint(ServiceType.VOLUME_BACKUP, "https://vbs.cn-north-1.myhwclouds.com/v2/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.DNS, "https://dns.myhwclouds.com/v2"); endpointResolver.addOverrideEndpoint(ServiceType.AUTO_SCALING, "https://as.cn-north-1.myhwclouds.com/autoscaling-api/v1/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.CLOUD_EYE, "https://ces.cn-north-1.myhwclouds.com/V1.0/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.LOAD_BALANCER, "https://elb.cn-north-1.myhwclouds.com/v1.0/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.MAP_REDUCE, "https://mrs.cn-north-1.myhwclouds.com/v1.1/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.KEY_MANAGEMENT, "https://kms.cn-north-1.myhwclouds.com/v1.0/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.CLOUD_TRACE, "https://cts.cn-north-1.myhwclouds.com/v1.0/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.ANTI_DDOS, "https://antiddos.cn-north-1.myhwclouds.com/v1/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.Notification, "https://smn.cn-north-1.myhwclouds.com/v2/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.MessageQueue, "https://dms.cn-north-1.myhwclouds.com/v1.0/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.MAAS, "https://maas.cn-north-1.myhwclouds.com/v1/%(project_id)s/objectstorage"); endpointResolver.addOverrideEndpoint(ServiceType.DATABASE, "https://rds.cn-north-1.myhwclouds.com"); // step 2: setup the authentication credit String user = "wanglianmin"; String password = "XXXX"; String projectId = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; // 华为云-用户中心-账号管理-基本信息-安全凭证-管理我的凭证,项目ID,按照region区分,如果想在华北创建资源,就找cn-north-1对应的项目ID。 String userDomainId = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; // 华为云-用户中心-账号管理-基本信息-安全凭证-管理我的凭证,账户ID,各个区域统一。 String authUrl = "https://iam.cn-north-1.myhwclouds.com/v3"; // step 3: initial OpenStack4j Client OSFactory.enableHttpLoggingFilter(true); // config of the client // with language setting is required for RDS(trove&database) service Config config = Config.newConfig().withEndpointURLResolver(endpointResolver).withLanguage(LANGUAGE) .withSSLVerificationDisabled(); // initial client OSClientV3 osclient = OSFactory.builderV3().withConfig(config).endpoint(authUrl) .credentials(user, password, Identifier.byId(userDomainId)).scopeToDomain(Identifier.byId(userDomainId)) .scopeToProject(Identifier.byId(projectId)).authenticate(); // // use client to visit DNS API // // create a public zone Zone creation = DesignateZone.builder().name("sdk.tutorial.com.").description("tutorial").ttl(600) .email("admin@tutorial.com").build(); Zone zone = osclient.dns().zones().create(creation); // get the created zone Zone get = osclient.dns().zones().get(zone.getId()); // delete the created zone //osclient.dns().zones().delete(get.getId()); List list = osclient.dns().zones().list(); System.out.println(list); // delete zone osclient.dns().zones().delete(get.getId()); }}[/code]再来一个ECS弹性云服务器的示例,包括查询Server、创建Server、启动、停止、重启、删除Server[code]import java.util.List;import java.util.stream.Collectors;import sun.misc.BASE64Encoder;import sun.misc.BASE64Decoder;import java.util.ArrayList;import java.util.HashMap;import java.util.Map;import java.util.concurrent.TimeUnit;import com.huawei.openstack4j.api.Builders;import com.huawei.openstack4j.api.OSClient.OSClientV3;import com.huawei.openstack4j.api.types.ServiceType;import com.huawei.openstack4j.core.transport.Config;import com.huawei.openstack4j.model.common.ActionResponse;import com.huawei.openstack4j.model.common.Identifier;import com.huawei.openstack4j.openstack.OSFactory;import com.huawei.openstack4j.openstack.identity.internal.OverridableEndpointURLResolver;import com.huawei.openstack4j.model.compute.Action;import com.huawei.openstack4j.model.compute.RebootType;import com.huawei.openstack4j.model.compute.Server;import com.huawei.openstack4j.model.compute.Server.Status;import com.huawei.openstack4j.model.compute.ServerCreate;public class Demo_for_WebSite { private static final String LANGUAGE = "zh-cn"; public static void main(String[] args) { /* 第一步:填入华为云区域的endpoint * 如下,对接华北区1就需要填入华北区服务的endpoint,以下为全量服务,用户根据自己的需要进行覆写 */ OverridableEndpointURLResolver endpointResolver = new OverridableEndpointURLResolver(); endpointResolver.addOverrideEndpoint(ServiceType.VOLUME_BACKUP, "https://vbs.cn-north-1.myhuaweicloud.com/v2/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.DNS, "https://dns.myhuaweicloud.com/v2"); endpointResolver.addOverrideEndpoint(ServiceType.AUTO_SCALING, "https://as.cn-north-1.myhuaweicloud.com/autoscaling-api/v1/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.CLOUD_EYE, "https://ces.cn-north-1.myhuaweicloud.com/V1.0/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.LOAD_BALANCER, "https://elb.cn-north-1.myhuaweicloud.com/v1.0/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.MAP_REDUCE, "https://mrs.cn-north-1.myhuaweicloud.com/v1.1/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.KEY_MANAGEMENT, "https://kms.cn-north-1.myhuaweicloud.com/v1.0/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.CLOUD_TRACE, "https://cts.cn-north-1.myhuaweicloud.com/v1.0/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.ANTI_DDOS, "https://antiddos.cn-north-1.myhuaweicloud.com/v1/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.Notification, "https://smn.cn-north-1.myhuaweicloud.com/v2/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.MessageQueue, "https://dms.cn-north-1.myhuaweicloud.com/v1.0/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.MAAS, "https://maas.cn-north-1.myhuaweicloud.com/v1/%(project_id)s/objectstorage"); endpointResolver.addOverrideEndpoint(ServiceType.DATABASE, "https://rds.cn-north-1.myhuaweicloud.com"); /* 第二步: 配置鉴权信息(以对接华北区为例) * user为用户名 * projectId为华为云控制台-账户中心-基本信息-管理我的凭证-项目列表中华北区的项目ID * userDomainId为华为云控制台-账户中心-基本信息-管理我的凭证的账户ID * authURL为IAM服务华北区的域名 */ String user = "wanglianmin"; String password = "XXXXXX"; String projectId = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; String userDomainId = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; String authUrl = "https://iam.cn-north-1.myhuaweicloud.com/v3"; // 第三步: 初始化一个连接 OSFactory.enableHttpLoggingFilter(true); //调试用,可以显示request body和response body Config config = Config.newConfig().withEndpointURLResolver(endpointResolver).withLanguage(LANGUAGE) .withSSLVerificationDisabled(); OSClientV3 osclient = OSFactory.builderV3().withConfig(config).endpoint(authUrl) .credentials(user, password, Identifier.byId(userDomainId)).scopeToDomain(Identifier.byId(userDomainId)) .scopeToProject(Identifier.byId(projectId)).authenticate(); // 第四步: 过滤查询弹性云服务器列表 Map filter_name = new HashMap(); filter_name.put("name", "ecs"); filter_name.put("status", "ACTIVE"); List servers = osclient.compute().servers().list(filter_name); System.out.println(servers); // 第五步:创建虚拟机,填入所需参数;停止、启动、重启、删除虚拟机 String imageId = "1189efbf-d48b-46ad-a823-94b942e2a000"; String flavorId = "s2.small.1"; String networkId = "ef039b60-6a14-42d1-963b-687b627fea08"; String imageId_Windows = "201150a6-479e-45f3-8a4c-fe91855758f0"; // 创建Linux密码虚拟机,目前密码使用user-data参数传入,将来会统一使用adminPass参数(注意echo后面的是单引号,单引号!!!) String userData_org = "#!/bin/bash \r\n echo ´root:P@ssWr0d123´ | chpasswd ;"; byte[] userData_byte = userData_org.getBytes(); String userData = new BASE64Encoder().encode(userData_byte); // generate networkList ArrayList networkList = new ArrayList(); networkList.add(networkId); // generate server body ServerCreate sc_Linux = Builders.server().name("zt-Linux-test-sdk").flavor(flavorId).image(imageId).availabilityZone("cn-north-1b").userData(userData).networks(networkList).build(); System.out.println("New Server body " + sc_Linux); Server newServer = osclient.compute().servers().boot(sc_Linux); osclient.compute().servers().waitForServerStatus(newServer.getId(), Status.ACTIVE, 10, TimeUnit.MINUTES); System.out.println("New Server " + newServer); // 创建Windows密码虚拟机,目前密码使用metadata参数传入,将来会统一使用adminPass参数 ServerCreate sc_Windows = Builders.server().name("zt-Windows-test-sdk").flavor(flavorId).image(imageId_Windows).availabilityZone("cn-north-1b").addMetadataItem("admin_pass", "P@ssWr0d123").networks(networkList).build(); System.out.println("New Server body " + sc_Windows); Server newServer_Windows = osclient.compute().servers().boot(sc_Windows); osclient.compute().servers().waitForServerStatus(newServer_Windows.getId(), Status.ACTIVE, 10, TimeUnit.MINUTES); System.out.println("New Server " + newServer_Windows); // 停止虚拟机 ActionResponse repStop = osclient.compute().servers().action(newServer.getId(), Action.STOP); if(repStop.isSuccess()) { System.out.println("Stop the server success, status = " + newServer.getId() + newServer.getVmState()); }else { System.out.println("Stop the server failed " + newServer.getId()); } osclient.compute().servers().waitForServerStatus(newServer.getId(), Status.SHUTOFF, 3, TimeUnit.MINUTES); // 启动虚拟机 ActionResponse repStart = osclient.compute().servers().action(newServer.getId(), Action.START); if(repStart.isSuccess()) { System.out.println("Start the server success, status = " + newServer.getId() + newServer.getVmState()); }else { System.out.println("Start the server failed " + newServer.getId()); } osclient.compute().servers().waitForServerStatus(newServer.getId(), Status.ACTIVE, 3, TimeUnit.MINUTES); // 重启虚拟机 ActionResponse repReboot = osclient.compute().servers().reboot(newServer.getId(), RebootType.SOFT); if(repReboot.isSuccess()) { System.out.println("Reboot the server success, status = " + newServer.getId() + newServer.getVmState()); }else { System.out.println("Reboot the server failed " + newServer.getId()); } osclient.compute().servers().waitForServerStatus(newServer.getId(), Status.ACTIVE, 3, TimeUnit.MINUTES); // 删除虚拟机 ActionResponse repDelete = osclient.compute().servers().delete(newServer.getId()); if(repDelete.isSuccess()) { System.out.println("Delete the server success, status = " + newServer.getId() + newServer.getVmState()); }else { System.out.println("Delete the server failed " + newServer.getId()); } ActionResponse repDelete_Windows = osclient.compute().servers().delete(newServer_Windows.getId()); if(repDelete_Windows.isSuccess()) { System.out.println("Delete the server success, status = " + newServer_Windows.getId() + newServer.getVmState()); }else { System.out.println("Delete the server failed " + newServer_Windows.getId()); } }
-
Infoworld 消息, 2017 年,Java、JavaScript、Kotlin、TypeScript 、 C ++ 等编程语言的特性都迎来了较大变化。总的来说,这一年不管是老牌的语言,还是新兴语言,都有了不同程度的改进。 Java 期待已久的 JDK 9 在 9 月正式发布了,作为 Java 标准的最新实现,曾因为其模块化技术引起争议。尽管模块化系统旨在提供可伸缩性,性能和安全性方面的优势,但包括 Red Hat 和 IBM 在内的关键参与者却不同意 Oracle 实施它。他们对应用的兼容性表示担忧,并对最初的建议投了反对票。直到最后的再次修改,才让反对方感到满意,通过了复审提案,为迟迟不能发布的版本扫清了道路。 下一个版本 JDK 10 计划将在 2018 年 3 月迅速推出,具有局部变量的类型推导和垃圾收集器接口等特性。 而 Java EE ,甲骨文已将其交由 Eclipse 基金会管理。同时,Oracle 在发布 Java 9 的同时也发布了 Java EE 8 。 Java EE 8 包含云、HTML5 和 HTTP / 2 等特性。 JavaScript 在 Web 开发中,2017 年许多 JavaScript 工具迎来了大版本更新,包括: 11 月的 Angular 5:包含一个构建优化器,支持渐进的网络应用程序和 Material Design 组件。 9 月的 React 16 :重写了 React 内核以提高对复杂应用程序的响应速度。 3 月的 Angular 4 :专注于构建更小的应用。 同时,TypeScript 也迎来多次更新: 11 月的 TypeScript 2.6 具有严格的模式标记和错误抑制注释。 8月的 TypeScript 2.5 使得复杂的重写变得更容易。 6 月的 TypeScript 2.4 具有动态展示功能,使应用更加节省资源。 4 月的 TypeScript 2.3 支持 ECMAScript 异步生成器和迭代器。 2 月的 TypeScript 2.2 强调与 React Native 框架的兼容性,以更好地构建原生移动应用。 即将于 2018 年 1 月推出的 TypeScript 2.7,将改进对象字面量的类型推断。 Kotlin 成为 Android 官方支持开发一级语言的 Kotlin 在 2017 年时一颗冉冉升起的新星, 2017 年推出的版本包括: Kotlin 1.2 于 11 月发布,提供在多个平台上重复使用代码的实验性功能。 支持 Java 9 。 Kotlin 1.1 于 3 月发布,提供了对 JavaScript 支持。 C ++ 今年等到了 C ++ 17 的发布,重点在于使语言更易于使用,提升编程便利。 接下来是 C ++ 20 ,预计将于 2019 年夏季完成功能并于 2020 年发布。它计划包含对并发性和库特性的改进。 此外,还值得一提的是微软在 12 月推出了 Q#量子编程语言,它将传统的编程概念如函数、变量、分支、以及语法高亮的开发环境和量子调试器带到量子计算领域。该语言与主要与 Visual Studio IDE 协同工作,并在 Quantum 开发工具包中集成推出。
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签