Groove list操作-转数组,collect,each等

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

list转换为数组

List list = ['a','b','c','d']
def strs = list as String[]
println strs[0]

使用了Groovy语言,就能时不时的感受到Groovy语言在编码风格上与Java语言的不同。当然,我们首先感受到的可能就是在Groovy语言中无处不在的闭包,其中最最常用的是each方法。

比如,下面的代码段是我们在Java语言中常用的遍历风格:

for(int i=0;i<list.size();i++)
{System.out.println(list.get(i));
}

但是,我们在Groovy语言中常用的遍历风格却是如下的代码段:

      list.each{

         println it

  }

 

这种风格,已经让我强烈感受到了Groovy语言编码的快捷性。但是,我们,对于长期使用Java语言的我们来说,Groovy语言在许许多多的地方表现出它的风格,但我们由于使用Java语言的惯性,未必能很自然的使用它们。

比如,我们有如下的一个集合对象:

 

      def list = [1,2,3,4]

 

现在,我们需要得到一个集合对象,它的每一个元素是上面的list对象的每一个元素的两倍。我们从Java语言过来的人很容易写出如下的代码来:

 

      def result = []

     

      list.each{

         result << it*2

      }

 

我们可能会洋洋自得,我们的each方法使用的不错,代码比起Java语言来简单得多了。但实际上,Groovy语言为我们准备了更加简单的方法,这就是Groovy语言风格的集合方法--collect方法。

 

      def result = list.collect{it*2}

 

可以看到,只有一个语句行,就代替了上面的三个语句行。这就是我们Groovy风格的代码,同样的方法还有"collect(Collection collection, Closure closure)","collectAll(Closure closure)"和"collectAll(Collection collection, Closure closure)"。

 

还是上面的list对象,比如,我们想找出该对象中所有大于2的元素来,我们的Java语言风格应该是这样的:

     

      def result = []

 

      list.each{

           if(it>2)

              result << it

       }

 

       println result

   

 

但是,这种过滤,在Groovy语言中,同样可以找到集合方法来代替它,使得代码更加具有Groovy语言风格:

   

 

       def result = list.grep{

           it > 2

       }

 

    println result

 

是的,在Groovy语言中,我们对集合元素的过滤一般都使用"grep"方法,这样的代码更加具有Groovy风格一些。具有同样一些功能的方法还有"find(Closure closure)","findAll(Closure closure)"。

 

在Java语言中,对List的遍历方法是万能的,我们要做的一切功能都必须从遍历方法开始。比如,我们想知道上面的list对象是否所有的元素都大于0。在Java语言中,我们会写出如下的代码:

 

       boolean isMoreThanZero = true;

 

       for(int i in list)

       {

           if(i<=0)

           {

              isMoreThanZero = false;

              break;

           }

       }

      

    println isMoreThanZero

 

在Groovy语言中,同样有Groovy风格的方法来帮我们省掉一大段的代码,这就是"every"方法:

 

       def isMoreThanZero = list.every{

           it>0

       }

      

    println isMoreThanZero

 

同样类型的方法还有"any(Closure closure)","any()"和"every()"。

 

除了上面的一些Groovy风格的代码,我们还有难度更大一些的Groovy语言风格的方法,比如注入方法--"inject"。

比如,我们想把list对象的所有元素相加起来,然后再和10求和。Java语言的编码风格看起来如下:

 

       def count = 10

      

       list.each{

           count+=it

       }

 

    println count

 

但Groovy语言风格的代码看起来如下所示:

 

       def count = list.inject(10){result,it->

           result+it

       };

 

    println count

 

类似这样的注入方法,Groovy语言还有集合方法"count(Object value)"。

 

还有一个集合方法,对于字符串特别好用。比如,我们想把上面的list对象的所有元素连接成一个字符串。Java语言的风格是这样的:

 

       def result = ''

      

       list.each{

           result+=it

       }

 

       println result

   

Groovy语言风格的代码则是如下:

 

       def result = list.join()

 

       println result

   

 

好了,就举出这么多了,都是一些集合方法配合闭包来使用而形成的Groovy语言风格的代码,写起来既快捷又简约,体现出Groovy语言作为动态语言的特点来。

转载于:https://my.oschina.net/sfshine/blog/1939582

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

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

相关文章

支持多种操作系统的新一代服务主机

一个应用需要常驻操作系统后台服务&#xff0c;可选框架有WindowsServiceLifeTime和SystemdLifeTime&#xff0c;但需要区别对待不同操作系统且需要另外写命令安装。NewLife.Agent自2008年设计以来&#xff0c;一直秉着简单易用的原则&#xff0c;不仅实现了服务框架&#xff0…

c#中的奇异递归模式

奇异递归模式&#xff0c;Curiously Recurring Template Pattern (CRTP) &#xff0c;作用是能使父类中能够使用子类的信息。下面是我对这个问题的分析过程。 按照一般的继承关系&#xff0c;父类是无法访问到子类的&#xff0c;所以很自然的想到了c#中的泛型&#xff0c;将子类…

面试中get和post的区别

get和post的区别主要有以下几方面&#xff1a;1、url可见性&#xff1a; get&#xff0c;参数url可见&#xff1b; post&#xff0c;url参数不可见2、数据传输上&#xff1a; get&#xff0c;通过拼接url进行传递参数&#xff1b; post&#xff0c;通过body体传输参数3、缓存性…

程序猿与线性代数

逛微博&#xff0c;摸到了一堆宝&#xff1a;关于线性代数学习的文章。先是发现了陈晓鸣&#xff08;http://weibo.com/acumon&#xff09;&#xff0c;前百度资深project师&#xff0c;终身学习者。再找到“文艺复兴记”&#xff08;http://weibo.com/weidagang&#xff09;。…

Verilog MIPS32 CPU(八)-- 控制器

Verilog MIPS32 CPU&#xff08;一&#xff09;-- PC寄存器Verilog MIPS32 CPU&#xff08;二&#xff09;-- RegfilesVerilog MIPS32 CPU&#xff08;三&#xff09;-- ALUVerilog MIPS32 CPU&#xff08;四&#xff09;-- RAMVerilog MIPS32 CPU&#xff08;五&#xff09;--…

[翻译]Dapr 长程测试和混沌测试

介绍这是Dapr的特色项目&#xff0c;具体参见&#xff1a;https://github.com/dapr/test-infra/issues/11 &#xff0c;在全天候运行的应用程序中保持Dapr可靠性至关重要。在部署真正的应用程序之前&#xff0c;可以通过在受控的混沌环境中构建&#xff0c;部署和操作此类应用程…

python UDP-数据报协议

基于udp协议通信的套接字 服务端 1 from socket import *2 3 server socket(AF_INET, SOCK_DGRAM) # SOCK_DGRAM>数据报协议4 server.bind((127.0.0.1, 8080))5 6 print(start....)7 while True:8 data, client_addr server.recvfrom(1024) # (bhello, (127.0.0.1, …

Mysql Lost connection to MySQL server at ‘reading initial communication packet', system error: 0

一、问题描述&#xff1a; 在服务器端可以正常连接并操作mysql&#xff0c;但是在windows端使用navicat工具远程ssh连接就出现下面错误。 1、服务器端&#xff1a; 2、windows端navicat连接 3、原因 原来我今天在做主从配置的时候&#xff0c;将 /etc/my.cnf 配置文件中的b…

自定义ProgressBar(圆)

2019独角兽企业重金招聘Python工程师标准>>> <lib.view.progressbar.ColorArcProgressBarandroid:layout_width"match_parent"android:layout_height"220dip"android:id"id/barInterest"android:layout_centerInParent"true&…

C# Task用法详解

概述Task是微软在.Net 4.0时代推出来的&#xff0c;Task看起来像一个Thread&#xff0c;实际上&#xff0c;它是在ThreadPool的基础上进行的封装&#xff0c;Task的控制和扩展性很强&#xff0c;在线程的延续、阻塞、取消、超时等方面远胜于Thread和ThreadPool&#xff0c;所以…

函数调用堆栈图

转载于:https://www.cnblogs.com/DeeLMind/p/7617972.html

jquery运动

在前面封装的move.js框架&#xff0c;在jquery中有同样封装好的功能animate()。使用方法非常类似&#xff0c;下面我们看看animate的使用方法&#xff0c;有了原生的运动方法&#xff0c;然后再使用jquery的运动方法就会变得非常简单。 animate()语法 $(selector).animate({par…

Session的原理,大型网站中Session方面应注意什么?

一、Session和Cookie的区别 Session是在服务器端保持会话数据的一种方法&#xff08;通常用于pc端网站保持登录状态&#xff0c;手机端通常会使用token方式实现&#xff09;&#xff0c;存储在服务端。 Cookie是在客户端保持用户数据&#xff0c;存储位置是客户端&#xff08…

MySQL5.5读写分离之mysql-proxy

通常一个网站在初期访问量都比较小&#xff0c;所以一般的小架构足以支撑。但是&#xff0c;当网站逐渐发展起来后&#xff0c;随之而来的是大量的访问&#xff0c;这时候最先出现的瓶颈就是数据库了。因为数据的写入读取操作&#xff08;I/O&#xff09;是集群中响应速度最慢的…

两圆相交求面积 hdu5120

转载 两圆相交分如下集中情况&#xff1a;相离、相切、相交、包含。 设两圆圆心分别是O1和O2&#xff0c;半径分别是r1和r2&#xff0c;设d为两圆心距离。又因为两圆有大有小&#xff0c;我们设较小的圆是O1。 相离相切的面积为零&#xff0c;代码如下&#xff1a; [cpp] view …

Python_list部分功能介绍

x.append():在列表尾部添加一个元素 x.clear():把列表清空 x.count():判断某个元素出现的次数 x.extend():合并两个列表&#xff0c;或者一个元组 x.index():获取元素下标 x.insert():指定下标添加元素 x.pop():移除某一元素&#xff0c;移除的元素可获取 x.remove():移除指定的…

一招解决开发环境问题 —— 远程容器开发指南

前言使用C作为主要开发语言的程序猿们应该会认同搭建开发环境是一件烦人的事情。为了编译一个程序不仅需要下载各种依赖包&#xff0c;还可能面临本地系统不兼容、编译器版本不一致、包版本冲突等各种问题。笔者在运营iLogtail开源社区的过程中发现开发和调试环境问题也是成员问…

php中常用的加密方式

一、md5 要说php中的最常用的加密方式&#xff0c;md5可以说是当仁不让。 使用起来也很简单便捷。 注&#xff1a;使用方式请看 六、md5加密方式的漏洞及解决方案 二、password_hash 作为php5.5以上版本专门用于加密的方式&#xff0c;自然有其独到之处。 使用方式链接&a…

解决问题的策略-分而治之

一个宏伟的目标看上去遥不可及&#xff0c;这怎么可能做成呢&#xff1f;但是你把这些目标分解成一个一个的小目标&#xff0c;小目标再往下分解&#xff0c;分解到最后&#xff0c;分解成细枝末节时你会发现&#xff0c;这事其实是可以做的。这个做成了再往下走一步&#xff0…

UITabBarController的基本原理及使用(一)

前言 UITabBarController在iOS开发中是一个高频使用的控制器&#xff0c;典型的案例如QQ、微信均使用UITabBarController布局。本文将从一个新建工程&#xff0c;和大家一起了解UITabBarController的基本原理和使用方法。 基本概念 UITabBarController能够方便地管理多个控制器…