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.pswp.cn/news/282266.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282266.shtml
英文地址,請注明出處:http://en.pswp.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能夠方便地管理多個控制器…