java erlang_Java开发人员的Erlang

java erlang

您可能没有注意到,但是距离我上次发布博客已经过去了几个星期。 这是由于我的Soleus骨折了,而且我的腿是石膏模型。 不能动弹,我认为调查完全不同的东西是个好主意–要么看那一天,要么看白天的电视,尽管Kojak和Magnum PI的重播很诱人,但对Erlang的调查却排在首位。

这里要记住的是,这不是一个
Erlang教程 ,这里的想法是检查Erlang和Java之间的一些相似之处,以尝试提供学习Erlang的起点。 如果我犯了任何啸叫错误,那么希望有更多Erlang经验的人会告诉我。
erlang徽标 入门时,他们首先告诉您有关Erlang的信息,这是一种功能语言。 但是,在您陷入困境之前,它是一种结构良好的功能语言,以为您正在处理对象。

那是什么意思 在Java中,代码存储在表示类的文件中,类是执行单一职责的一组数据和方法。 您可以实例化一个类并通过变量访问其方法,也可以通过其类名访问其静态方法。

在Erlang中,代码存储在称为模块的文件中,每个模块都是执行一项职责的一组功能。 您无法实例化模块,并且实例变量和类变量不存在。 您只能使用方法参数变量。 您可以通过其模块名称来访问方法,就像访问Java静态方法一样。 与Java类一样,Erlang模块具有私有和公共功能。 Java徽标

作为Java开发人员,我很高兴发现有一个
eclipse的Erlang插件 。 这是因为学习一种语言而不是一种语言和一套全新的开发工具会更快。 几个月前,我与几位Erlang顾问进行了交谈,他们说他们更喜欢使用emacs,而我确实想知道为什么要等到我发现eclipse插件才算不错。 仍然足以开始使用,并且它具有潜力。

Java开发人员应该有其他相似之处:Erlang模块源文件被编译为.beam文件,然后在Erlang虚拟机上运行; 还有eunit ,它是Erlang的等效于JUnit ,还有一个log4erl ,顾名思义,是Erlang的Log4J版本。 使用edoc (Erlang的Javadoc版本)和标准项目布局可以自动生成文档,这与Maven布局非常相似,如下所示:
屏幕截图2013年7月29日在18.39.29
其结构与Maven略有不同: 目标目录称为ebin ,并且srctest目录已在项目目录级别进行了拆分,但是易于遵循并且您已习惯了。

根据到目前为止的内容,您会认为Java和Erlang之间的最大区别是Java文件具有.java扩展名,而Erlang文件具有.erl扩展名。 不幸的是,还有更多的东西,首先是没什么大不了的,或者是Erlang看起来很奇怪的语法1

为了对此进行调查,我认为我将使用现有的ShoppingCartShoppingCartTest类并将其转换为Erlang。 我的telldontask项目中提供了这两个类,它们看起来像这样……

ShoppingCart类

public class ShoppingCart { private final List<Item> items; private PaymentMethod method; public ShoppingCart() { items = new ArrayList<Item>(); } public void addItem(Item item) { items.add(item); } public double calcTotalCost() { double total = 0.0; for (Item item : items) { total += item.getPrice(); } return total; } public double calcTotalCost(double shipping, double minShippingAmount) { double totalCost = calcTotalCost(); if (totalCost > minShippingAmount) { totalCost += shipping; } return totalCost; } public void setPaymentMethod(PaymentMethod method) { this.method = method; } public void pay(double shipping, double minShippingAmount) { double totalCost = calcTotalCost(shipping, minShippingAmount); method.pay(totalCost); } 
}

ShoppingCartTest JUnit

public class ShoppingCartTest { /** * Test method for {@link tell_dont_ask.ask.ShoppingCart#getAllItems()}. */ @Test public void calculateTotalCost() { ShoppingCart instance = new ShoppingCart(); Item a = new Item("gloves", 23.43); instance.addItem(a); Item b = new Item("hat", 10.99); instance.addItem(b); Item c = new Item("scarf", 5.99); instance.addItem(c); double totalCost = instance.calcTotalCost(); assertEquals(40.41, totalCost, 0.0001); } }

上面的代码演示了一些非常基本的购物车功能; 但是,有关这些类如何工作的更多详细信息,请参阅“ 定义告诉不要问”和“ 分解告诉不要问” 。

Erlang中的等效代码如下所示:

shopping_cart模块

-module(shopping_cart). %% ==================================================================== 
%% API functions 
%% ==================================================================== 
-export([add_item/2,calc_total_cost/1,calc_total_cost/3,pay/3]). %% @doc Add an item to the order list 
add_item(OrderList,Item) -> [Item | OrderList]. %% @doc Calculate the total cost of all the items in a list. The List must have the following format: 
%%  [{itemName, Price}] 
%%  where 
%%  itemName -> atom 
%%  Price -> float() 
calc_total_cost(OrderList) -> round_dp(calc_total_cost(0,OrderList)). %% @doc Calculate the total cost of all the items in a list adding a shipping cost if the value is below a certain limit. 
%% The Order List must have the following format: 
%%  [{itemName, Price}] 
%%  where 
%%  itemName -> atom 
%%  Price -> float() 
calc_total_cost(OrderList,Shipping, MinShippingAmount) -> Cost = calc_total_cost(OrderList), TotalCost = Cost + shipping(Cost,Shipping,MinShippingAmount), round_dp(TotalCost). %% @doc @todo Method not implemented 
pay(_Order,_Shipping, _MinShippingAmount) -> unimplemented. %% ==================================================================== 
%% Internal functions 
%% ==================================================================== calc_total_cost(Result,[{_,Price} | TheRest]) -> calc_total_cost(Result + Price,TheRest); 
calc_total_cost(Result,[]) -> Result. shipping(Cost,Shipping,MinShippingAmount) when Cost < MinShippingAmount -> Shipping; 
shipping(_,_,_) -> 0. round_dp(Number) -> List = float_to_list(Number,[{decimals,2}]), list_to_float(List).

shopping_cart_tests模块

-include_lib("eunit/include/eunit.hrl"). -module(shopping_cart_tests). %% ==================================================================== 
%% API functions 
%% ==================================================================== 
-export([]). %% @doc Calculate total code - written to match the Java style 
calculate_total_cost_test() -> EmptyList = [], OrderList1 = shopping_cart:add_item(EmptyList,{gloves,23.43}), OrderList2 = shopping_cart:add_item(OrderList1,{hat,10.99}), OrderList3 = shopping_cart:add_item(OrderList2,{scarf,5.99}), ?_assertEqual(40.42,shopping_cart:calc_total_cost(OrderList3)). %% @doc Calculate total cost example - written in a better erlang style 
calculate_total_cost_2_test() -> OrderList = [{gloves,23.43},{hat,10.99},{scarf,5.99}], ?assertEqual(40.41,shopping_cart:calc_total_cost(OrderList)).

专家告诉我,使用Erlang可以用更少的代码行做更多的事情。 这里不是这种情况,但是我又添加了很多注释行(用'%'分隔符表示)。

与Java相比,上面的代码看起来很怪异(因为我没有从Erlang到HTML的转换器,所以看上去也有些丑陋)。 没有任何实例变量,因此所需的任何数据都作为函数参数传入。 如果看一下add_item(…)您会发现它将Item变量添加到列表的开头,例如: items.add(item) (请注意,在Erlang中,变量名始终以大写字母开头)。

转到calc_total_cost() ,事情开始看起来真的很奇怪…… calc_total_cost(OrderList)只是calc_total_cost(0,OrderList)的包装。 calc_total_cost(0,OrderList)是对calc_total_cost(Result,[{_,Price} | TheRest])calc_total_cost(Result,[])的调用,它们是循环执行从列表中添加商品价格的函数。 除非它不循环; Erlang中没有for循环,您必须使用递归,在calc_total_cost(Result,[{_,Price} | TheRest])逐步添加价格,然后递归调用自身,直到列表为空。

关于Erlang语法的问题是,尽管对于使用C派生语言的Java开发人员来说,它是非常合乎逻辑的,因此很容易上手。

要注意的一件事是,上面的Erlang是模仿Java编写的。 这可能不是您从头开始开发Erlang购物车的方式。

为什么选择Java而不是Erlang? 当然不是因为它与Java相似。 当Java的功能和优点可以帮助您更有效,更经济地解决问题时,您会选择Erlang而不是Java。 根据LenartÖhman的Google Tech Talk Erlang的目标应用程序,这些应用程序必须是:

  • 容错
  • 马不停蹄
  • 同时
  • 分布,可扩展和异构
  • 软实时
  • 需要“原型性”

这些目标已经以多种方式实现。 例如,进程之间传递的消息是语言的一部分,而不是单独的API。 要将消息发送到另一个进程,只需键入:

Pid ! theMessage,

…其中Pid是将接收theMessage的进程的ID。 要发送消息,请输入在另一个Erlang虚拟机上运行的另一个进程:

Pid ! theMessage,

从这个不愉快的笑话中,我可能已经猜到Erlang虚拟机上的进程是透明的。 这意味着它与运行它们的机器上的Erlang进程没有什么不同。 无论是在本地还是在不同的物理硬件上。 这是因为Erlang虚拟机可以互相通信并且可以集群。 JVM之外的某种方式。

要接收消息,请使用Erlang关键字: receive ,如下所示:

%% @doc Receive a message and print the contents 
print() -> receive Message -> io:format("The message is: ~p~n",[Message]) end.

进程本身非常轻巧,旨在以其他语言无法模仿的方式在大型多核处理器上利用超线程。 流程在Erlang中非常重要,我在某处读到,如果Java是一种面向对象的语言,那么Erlang就是一种面向过程的语言。

如果此博客的内容像是Erlang的广告,那是因为在将脚趾浸入水中之后,我可以看到它比基于Java的解决方案更经济,更省力地解决了许多问题。 另一方面,还有Java和Spring(此博客的常见主题)更适合的那些问题。 计算机语言只是简单的工具,您应该选择适合自己的最佳语言。

1奇怪的是,您是否基于Prolog而不是C而成为Java程序员。
可从Captain Debug Github存储库中获得此​​博客的Java代码示例:
https://github.com/roghughe/captaindebug ,而Erlang代码可从我的Erlang Samples Github存储库中获得: https://github.com/roghughe/erlang_samples 。

参考:来自Captain Debug博客博客的JCG合作伙伴 Roger Hughes的Java开发人员Erlang 。

翻译自: https://www.javacodegeeks.com/2013/08/erlang-for-java-developers.html

java erlang

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347572.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 取消混杂模式,Linux下网卡混杂模式设置和取消

1、Linux下网卡常用的几种模式说明&#xff1a;广播方式&#xff1a;该模式下的网卡能够接收网络中的广播信息。组播方式&#xff1a;设置在该模式下的网卡能够接收组播数据。直接方式&#xff1a;在这种模式下&#xff0c;只有目的网卡才能接收该数据。混杂模式&#xff1a;在…

新容器!不再担心空指针, Java8 Optional类

Optional<T>类(java.util.Optional)是一个容器类&#xff0c;它可以保存类型T的值&#xff0c;代表这个值存在。或者仅仅保存null&#xff0c;表示这个值不存在。原来用 null 表示一个值不存在&#xff0c;现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常…

在Docker容器中的Tomcat上运行ADF Essentials

我经常开发示例应用程序。 我尝试了一些想法&#xff0c;运用了一些技巧&#xff0c;并通过示例应用程序与同事和博客读者分享了我的调查结果。 当某人想要了解该技术的实现方式时&#xff0c;他们只需查看源代码&#xff0c;就足以理解这个想法。 但是&#xff0c;如果他们想了…

非cpu0启动linux,SD卡无法启动Linux的问题及解决

最近在Zynq板上启动linaro桌面系统时&#xff0c;发现一个奇怪的问题&#xff0c;系统在启动到最后&#xff0c;已经打印了如下信息&#xff1a;[drm] Initialized axi_hdmi_drm 1.0.0 20120930 on minor 0&#xff0c;按理说后面就该是登录系统并显示shell提示符了&#xff0c…

新!详细!win10下MySQL数据库干净卸载安装与配置

微信公众号&#xff1a;创享日记 发送&#xff1a;sqlyog 获取SQLyog客户端安装包 文章目录官方下载卸载清除安装变量配置测试SQLyog客户端下载官方下载 链接直达&#xff1a;点击官方下载 1、选择 2、下载&#xff1a;点击download进入下载页面&#xff0c;选择“No thanks,…

linux系统基本使用教程,Linux系统的基本使用入门

终端&#xff1a;用户与主机交互&#xff0c;必然会使用到的设备&#xff0c;在Linux中也使用文件进行标识物理终端:直接接入到本机的显示器和键盘设备&#xff1a;又叫控制台&#xff1a;console物理终端设备文件&#xff1a;/dev/console虚拟终端&#xff1a;附加在物理终端之…

最基础,MySQL基础查询SELECT

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 1、查询表中字段 USE 要操作的数据库名; SELECT 查询的字段 …

linux编码 form表单,Linux以form表单形式上传文件讲解

先cd到要上传文件的目录下&#xff1a;rootiZ2zee1przeygbuu4rkwvxZ:/usr/local/test# ls1.png DSC_0192.JPG test.apk使用curl -F 或 curl --formcurl --form "fileDSC_0192.JPG" http://ip:port/projectName/busnews/upload*注意&#xff1a;不一定写file&#xff…

有条件了!筛选,MySQL条件查询SELECT-WHERE

1、基本语法 SELECT查询列表 FROM表名 WHERE筛选表达式;2、按条件表达式筛选 条件运算符&#xff1a;>,<,,!,<>,>,< 条件运算符不能判断null。 #在employees表中筛选工资大于12000的员工的所有信息 SELECT* FROMemployees WHEREsalary>12000;3、按逻辑…

rest和rest ful_为什么REST如此重要

rest和rest ful这篇文章致力于REST&#xff0c;一种塑造Web服务的架构风格&#xff0c;以及IT历史上最容易被误解的概念。 这篇文章针对的是正在设计Web服务api的人&#xff0c;他们没有完全了解REST的实际含义。 我想给你个主意。 这篇文章也发给了那些想知道REST意味着什么的…

流利的接口不利于维护

流利的接口 &#xff08;最初由Martin Fowler 创造&#xff09;是一种非常方便的与OOP中的对象进行通信的方式。 它使他们的外墙更易于使用和理解。 但是&#xff0c;它破坏了它们的内部设计&#xff0c;使它们更难以维护。 Marco Pivetta在他的博客文章Fluent Interfaces is E…

c语言初始化字符串 函数 manment,[转载]3.09进程(C语言班最后一天的课程)

1&#xff0c;进程&#xff1a;是容器&#xff0c;是内存上的概念。线程是CPU的概念。2&#xff0c;fork的作用是根据一个现有的进程复制出一个新进程&#xff0c;原来的进程称为父进程(Parents Process)&#xff0c;新进程称为子进程(Child Process)。系统中同时运行着许多进程…

减小程序规模!稀疏数组Sparsearray,数据结构二维数组与稀疏数组转换,Java实现

文章目录基本介绍应用实例基本介绍 当一个数组中大部分元素为0&#xff0c;或者为同一个值的数组时&#xff0c;可以使用稀疏数组来保存该数组。 稀疏数组的处理方法是: ①记录数组一共有几行几列&#xff0c;有多少个不同的值&#xff08;0除外&#xff09;。 ②把具有不同值…

ug弹簧可变性装配_弹簧可配置魔术

ug弹簧可变性装配Spring框架具有几个提供一系列服务的模块&#xff0c;其中许多模块仅可用于托管对象&#xff08;Spring Bean&#xff09;。有关这些服务的一些示例是依赖注入&#xff0c;事务管理&#xff0c;AOP服务等。当我们使用时&#xff0c;一切都很好对象即服务&#…

C语言课程设计报告输出杨辉三角,C语言学习:在屏幕上输出杨辉三角

杨辉三角的规律是&#xff1a;它的两条斜边都是由数字1组成的&#xff0c;而其余的数则是等于它肩上的两个数之和。 代码如下&#xff1a;#include#includeint main(){int i,j,k,arr[10][10]{0};/*arr[11][11]必须初始化&#xff0c;初始化为{0}*/printf("打印出杨辉三角&…

朴实!简单!依你所好,MySQL排序查询ORDER BY

1、基本语法 SELECT查询列表 FROM表 #可选&#xff08;WHERE ...&#xff09; ORDER BY排序列表 DESC/ASC;升序是ASC或者不写&#xff0c;降序是DESC 2、案例一&#xff1a;按字段&#xff08;*代表全部&#xff09; SELECT* FROMemployees ORDER BYsalary DESC;3、案例二&am…

使用一个命令执行单个Java源文件

JDK增强提案 &#xff08; JEP &#xff09; 草案于2017年末创建&#xff0c;名为“ 启动单文件源代码程序 ”&#xff08;其相关的JDK问题为JDK-8192920 &#xff09;。 顾名思义&#xff0c;该JEP草案旨在“增强Java启动器以支持运行作为Java源代码的单个文件提供的程序。” …

习惯性朴实简单!一起学习MySQL常见单行函数,字符数学日期流程控制

文章目录一、字符函数二、数学函数三、日期函数四、其他函数五、流程控制函数一、字符函数 1、大小写控制函数 ①UPPER()&#xff1a;转换成大写 SELECT UPPER(Hello);②LOWER()&#xff1a;转换成小写 SELECT LOWER(Hello);2、字符控制函数 ①LENGTH()&#xff1a;获取参数…

c语言程序设计陈雪芳,东莞理工学院C语言课程设计.doc

東莞理工學院C语言程序设计课程设计报告书院系名称 机械工程学院专业班级 2013级机械设计制造及其自动化1班组长成员指导教师 陈雪芳完成时间 2014年6月1日目 录1、系统功能及任务描述………………………..1.1系统总体功能描述………………………….1.2主要任务描述…………………

不可上位!数据结构队列,老实排队,Java实现数组模拟队列及可复用环形队列

文章目录队列简介数组模拟队列&#xff08;无法复用&#xff09;数组模拟环形队列&#xff08;可复用&#xff09;队列简介 队列是一个有序列表&#xff0c;可以用数组或是链表来实现。 遵循先入先出的原则。即先存入队列的数据&#xff0c;先取出&#xff0c;后存入的后取出…