Skip to content

四火的唠叨

一个纯正程序员的啰嗦

Menu
  • 所有文章
  • About Me
  • 关于四火
  • 旅行映像
  • 独立游戏
  • 资源链接
Menu

一段集合操作的不同语言表达

Posted on 04/09/201410/08/2024 by 四火

看到这样一条微博,觉得挺有意思,就记录在这里:

所谓对比,Java 真是足够啰嗦:

weibo

图不清楚,我来再叙述一下。要做的事情就是,把原有列表里面的每个元素都变成大写的,再放到一个新列表里面去。

这是 Java7 的版本: 

1
2
3
4
List list = Arrays.asList("andy", "michael", "thomas");
List list2 = new ArrayList<>();
for(String s : list)
    list2.add(s.toUpperCase());

 这是 Java8 的版本(移步阅读:《Java8 集合中的 Lambda 表达式》):

1
2
List list = Arrays.asList("andy", "michael", "thomas");
List list3 = list.stream().map((it)->it.toUpperCase()).collect(toList());

但是它的意义更多的在于使用流式调用和闭包以后,编程范型的转变,对问题解决的描述方式的改变。习惯了以后,它阅读理解起来更加自然,这更接近面向对象的方法调用,接近函数式调用。至于代码,其实并没有省掉多少。

这是 C# 3.5+的版本: 

1
2
var list = new[]{"andy", "michael", "thomas"}.ToList();
var list2 = (from item in list select item.ToUpper()).ToList();

有不少人在回复里面评论道这个代码简洁之类的云云,可是我不这样觉得,思路上是一样的,还是一个过程循环,只不过语法看起来要简单一些,而且 from…in…select…这样的写法缺少一点美感。

PHP 的写法看起来简单,但还是过程式的: 

1
array_map("strtoupper", array('andy','michael','thomas'));

Clojure: 

1
(map clojure.string/upper-case '("andy", "michael", "thomas"))

其中的单引号是用来防止后面的表达式被解析执行的。

Python: 

1
lst = [x.upper() for x in ['andy', 'michael', 'thomas']]

Python 在这里有一个比前面那些都简洁的地方就是中括号,形成 list。但是,Python 的写法把对元素的操作放到前面去了。这两点和高大上的 Haskell 是一样的:

1
[map toUpper x | x <- ["andy","michael","thomas"]] 

以上是第一大类,可称作 “过程式循环”。

第二大类则是隐含意义上的循环,像是 Vistor 模式,循环的流程代码不需要写,只需要写每个元素 map 操作的代码。

Scala 的版本是公认最简单的: 

1
val strs = Array("andy","michael","thomas").map(_.toUpperCase)

非常好理解,而且单纯就这个问题而言,也得益于 scala 的函数式特性,保证链表不变性,每次操作会产生新的链表,但是这个特性在这里是好处,简洁,但在别处就未必了。当然,如果你需要改变链表自己,那就要使用 ListBuffer。

还有 Perl 管道编程的版本:

1
2
list='andy michael thomas'
list2=`echo $list | tr a-z A-Z`

别忘了管道编程是链式调用的始祖,简洁还是啰嗦,这个看起来真和语言产生的时间没太大关系的。 

最后是 Ruby 的: 

1
%w[ andy michael thomas ].map(&:upcase)

其中的%w 仅仅是 “格式化命令”,在这里仅仅为了少打几个表示字符串的引号。

文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接 《四火的唠叨》

×Scan to share with WeChat

你可能也喜欢看:

  1. 多重继承的演变
  2. Java8 集合中的 Lambda 表达式
  3. Scala 的模式匹配
  4. 泛型趣谈
  5. 运行时动态增加枚举类型

5 thoughts on “一段集合操作的不同语言表达”

  1. Anonymous says:
    03/24/2015 at 4:55 PM

    就这个问题,groovy 比 Scala 更简单吧
    <code>["andy","michael","thomas"]*.toUpperCase()</code>

    Reply
  2. xxx says:
    05/03/2014 at 12:48 AM

    var list = new[]{"andy", "michael", "thomas"}.ToList();
    var list2 = list.select(s => s.ToUpper());
     
    何必为黑而黑

    Reply
  3. 新浪微博rss says:
    04/11/2014 at 11:40 AM

    我只会 java

    Reply
  4. Gao Jie says:
    04/10/2014 at 2:31 AM

    perl 的表达是这样的,你的写法让人有点无语:
    $list = qw/andy  boy girl/;
    $new_list = map{ uc} $list;

    Reply
    1. Gao Jie says:
      04/10/2014 at 2:39 AM

      半夜有点迷糊。
       
      @list = qw/andy  boy girl/;
      @new_list = map{ uc} @list;
      uc 是转化大写的函数.

      Reply

Leave a Reply to Gao Jie Cancel reply

Your email address will not be published. Required fields are marked *

订阅·联系

四火,啰嗦的程序员一枚,现居西雅图

Amazon Google Groovy Hadoop Haskell Java JavaScript LeetCode Oracle Spark 互联网 亚马逊 前端 华为 历史 同步 团队 图解笔记 基础设施 工作 工作流 工具 工程师 应用系统 异步 微博 思考 技术 数据库 曼联 测试 生活 眼界 程序员 管理 系统设计 缓存 编程范型 美股 英语 西雅图 设计 问题 面向对象 面试

分类

  • Algorithm and Data Structure (30)
  • Concurrency and Asynchronization (6)
  • System Architecture and Design (43)
  • Distributed System (18)
  • Tools Frameworks and Libs (13)
  • Storage and Data Access (8)
  • Front-end Development (33)
  • Programming Languages and Paradigms (55)
  • Testing and Quality Assurance (4)
  • Network and Communication (6)
  • Authentication and Authorization (6)
  • Automation and Operation Excellence (13)
  • Machine Learning and Artificial Intelligence (6)
  • Product Design (7)
  • Hiring and Interviews (14)
  • Project and Team Management (14)
  • Engineering Culture (17)
  • Critical Thinking (25)
  • Career Growth (57)
  • Life Experience and Thoughts (45)

推荐文章

  • 谈谈分布式锁
  • 常见分布式系统设计图解(汇总)
  • 系统设计中的快速估算技巧
  • 从链表存在环的问题说起
  • 技术面试中,什么样的问题才是好问题?
  • 从物理时钟到逻辑时钟
  • 近期面试观摩的一些思考
  • RSA 背后的算法
  • 谈谈 Ops(汇总 + 最终篇):工具和实践
  • 不要让业务牵着鼻子走
  • 倔强的程序员
  • 谈谈微信的信息流
  • 评审的艺术——谈谈现实中的代码评审
  • Blog 安全问题小记
  • 求第 K 个数的问题
  • 一些前端框架的比较(下)——Ember.js 和 React
  • 一些前端框架的比较(上)——GWT、AngularJS 和 Backbone.js
  • 工作流系统的设计
  • Spark 的性能调优
  • “残酷” 的事实
  • 七年工作,几个故事
  • 从 Java 和 JavaScript 来学习 Haskell 和 Groovy(汇总)
  • 一道随机数题目的求解
  • 层次
  • Dynamo 的实现技术和去中心化
  • 也谈谈全栈工程师
  • 多重继承的演变
  • 编程范型:工具的选择
  • GWT 初体验
  • java.util.concurrent 并发包诸类概览
  • 从 DCL 的对象安全发布谈起
  • 不同团队的困惑
  • 不适合 Hadoop 解决的问题
  • 留心那些潜在的系统设计问题
  • 再谈大楼扔鸡蛋的问题
  • 几种华丽无比的开发方式
  • 我眼中的工程师文化
  • 观点的碰撞
  • 谈谈盗版软件问题
  • 对几个软件开发传统观点的质疑和反驳
  • MVC 框架的映射和解耦
  • 编程的未来
  • DAO 的演进
  • 致那些自嘲码农的苦逼程序员
  • Java 多线程发展简史
  • 珍爱生命,远离微博
  • 网站性能优化的三重境界
  • OSCache 框架源码解析
  • “ 你不适合做程序员”
  • 画圆画方的故事

近期评论

  • panshenlian.com on 初涉 ML Workflow 系统:Kubeflow Pipelines、Flyte 和 Metaflow
  • panzhixiang on 关于近期求职的近况和思考
  • Anonymous on 闲聊投资:亲自体验和护城河
  • 四火 on 关于近期求职的近况和思考
  • YC on 关于近期求职的近况和思考
  • mafulong on 常见分布式基础设施系统设计图解(四):分布式工作流系统
  • 四火 on 常见分布式基础设施系统设计图解(八):分布式键值存储系统
  • Anonymous on 我裸辞了
  • https://umlcn.com on 资源链接
  • Anonymous on 我裸辞了
© 2025 四火的唠叨 | Powered by Minimalist Blog WordPress Theme
Menu
  • 所有文章
  • About Me
  • 关于四火
  • 旅行映像
  • 独立游戏
  • 资源链接