groovy collection api

40
Groovy Collection API Trygve Amundsen, Kodemaker

Upload: trygvea

Post on 19-Jan-2017

1.461 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: Groovy collection api

Groovy Collection APITrygve Amundsen, Kodemaker

Page 2: Groovy collection api

basics

Page 3: Groovy collection api

groovy collections

assert "string".collect { it } == ['s','t','r','i','n','g'] // string

• Java Collection (List, Map, Set mfl.)

• Array

• String

• Regexp

• Iterable

• CharSequence

• Object!

assert 42.collect { it } == [42]

Page 4: Groovy collection api

notation, lists

def emptyList = [] assert [] instanceof ArrayList

def list = [1,2,3]assert list[1..-1] == [2,3]assert list[-3..-2] == [1,2] assert list[2..1] == [3,2]

Page 5: Groovy collection api

notation, maps

def emptyMap = [:]assert [:] instanceof LinkedHashMap // predictable order

assert [a:1, b:2] == ['a':1, 'b':2]

method(a:1, b:2) // illusion of named parameters

Page 6: Groovy collection api

ranges are lists

assert (1..3) == [1,2,3]assert (1..<3) == [1,2]

assert (1..3) instanceof IntRange // groovy.langassert (1..3) instanceof List

Page 7: Groovy collection api

notation, list operators

assert [1,2] << 3 == [1,2,3] // leftShift()assert [1,2]+3 == [1,2,3] // plus()assert [1,2]+[3,4] == [1,2,3,4]assert [1,2,3]-[3,4] == [1,2] // minus()

Page 8: Groovy collection api

notation, spread operator

assert ["a","b","1"]*.isNumber() == [false,false,true]assert ["a","b","1"].number == [false,false,true]

Page 9: Groovy collection api

basics, api

Page 10: Groovy collection api

each

[1,2,3].each { println it}[1,2,3].each { item -> println item }

[1,2,3].eachWithIndex { item, i -> println "index ${i} contains ${item}" }[1,2,3].reverseEach { println it }

Page 11: Groovy collection api

find (filters)

assert [1,2,3].findAll { it % 2 } == [1,3]

assert [1,2,3].find { it % 2 } == 1

assert [1,2,3].findIndexValues { it %2 } == [0,2]

Page 12: Groovy collection api

collect (map)

assert [1,2,3].collect { it * it } == [1,4,9]

assert [1,[2,3],4].collectNested { it*it } == [1,[4,9],16]

assert [1,2,3].collectEntries { ['k' +it, it] } == [k1:1,k2:2,k3:3]

Page 13: Groovy collection api

changedunchanged

chan

ged

unch

ange

dnu

mbe

r of

item

s

item content

eacheachWithIndexreverseEach

findAlluniquetaildrop/take

collectcollectEntriescollectNested

Obj

ect

bool

ean

max, min, sum, countjoininject

anyevery

method returns

countByfindResultscollectManysplitC

olle

ctio

n

one

item

mul

tiple

item

s

findheadfirst/last

sortgroupBy

stackpush/pop

setplusminusintersect subsequencespermutationscombinations

Page 14: Groovy collection api

reducersassert [1,2,3].max() == 3assert [1,2,3].min() == 1assert [1,2,3].sum() == 6

assert [1,2,3].max{ -it } == 1assert [1,2,3].max{ a,b-> b<=>a } == 1

Page 15: Groovy collection api

reducers, cont’d

assert [1,2,3].any{ it > 3 } == falseassert [1,2,3].every{ it < 4 } == true

assert [1,2,3].join(";") == "1;2;3"

Page 16: Groovy collection api

reducers, inject

assert [1,2,3].inject(0) { acc, val -> acc+val } == 6assert [1,2,3].inject("0") { acc, val -> acc+val } == "0123"assert [1,2,3].inject([]) { acc, val -> acc+val } == [1,2,3]

assert [a:1,b:2].inject(0) { acc, key, val -> acc+val } == 3

Page 17: Groovy collection api

inject -> reduce

Object.metaClass.reduce = {initial, closure-> delegate.inject(initial, closure) }

[1,2,3].reduce(0){acc,val->acc+val}

Page 18: Groovy collection api

useful methods

Page 19: Groovy collection api

groupBy, countBy

assert [1,2,3].groupBy{it < 2 ? 'small' : 'big'} == [small:[1], big:[2,3]]assert [1,2,3].countBy{it < 2 ? 'small' : 'big'} == [small:1, big:2]

Page 20: Groovy collection api

set operations

assert [1,2]+3 == [1,2,3]assert [1,2]+[3,4] == [1,2,3,4]assert [1,2].plus([3,4]) == [1,2,3,4]

assert [1,2,3]-3 == [1,2]assert [1,2,3]-[2,3] == [1]assert [1,2,3].minus([2,3]) == [1]

assert [1,2,3].intersect([3,4]) == [3]assert [1,2,3].disjoint([4,5]) == true

assert [1,2,3].subsequences() == [[3], [1, 2, 3], [1], [2], [2, 3], [1, 3], [1, 2]] as Setassert [1,2,3].permutations() == [[1, 2, 3], [2, 3, 1], [3, 2, 1], [3, 1, 2], [2, 1, 3], [1, 3, 2]] as Setassert [[1,2],[3,4]].combinations() == [[1, 3], [2, 3], [1, 4], [2, 4]]

Page 21: Groovy collection api

Nested Collections

assert [1,[2,3],4].flatten() == [1,2,3,4]

assert [1,[2,3],4].collectNested { it+10 } == [11,[12,13],14]

assert [['a','b'], [1,2]].transpose() == [['a',1],['b',2]]

Page 22: Groovy collection api

functional styleassert [1,2,3].head() == 1assert [1,2,3].tail() == [2,3]

assert [1,2,3].first() == 1assert [1,2,3].last() == 3

assert [1,2,3].take(2) == [1,2]assert [1,2,3].drop(2) == [3]

assert [1,2,3].split { it<3 } == [[1,2],[3]]

Page 23: Groovy collection api

list as stackNOTE: mutates!

def list = [1,2,3]list.push(4)assert list == [1,2,3,4]assert list.pop() == 4assert list == [1,2,3]

Page 24: Groovy collection api

findResults

[1,2,3].findAll { it > 1 } .collect { it*it }

[1,2,3].findResults { it > 1 ? it*it : null }

is identical to

assert [1,2,3].findResults { it > 1 ? it*it : null } == [4,9]

Page 25: Groovy collection api

Other, possibly useful methods

assert [1,2,3].collectMany { [it**2, it**3] } == [1,1,4,8,9,27]

Page 26: Groovy collection api

map withDefault

def newMap = [:].withDefault { [] }[a:1,b:2,c:2].each { key, val -> newMap[val] << key}assert newMap == [1:['a'], 2:['b','c']]

Page 27: Groovy collection api

mutability

• all methods return new collections/objects

• a few exceptions exist, such as push/pop and sort(boolean mutate)

• objects and collections are generally mutable

• use asImmutable(), asSynchronized() for multithreading

• or better: use gpars (included in groovy jdk)

• (that’s a different talk - coming up on groovy meetup!)

Page 28: Groovy collection api

doc & src

Page 29: Groovy collection api

Groovy JDK doc

Page 30: Groovy collection api

Groovy JDK doc

Page 31: Groovy collection api

DefaultGroovyMethods

Page 32: Groovy collection api

real-world example

params.findAll { key, val -> // filtrer kun diagnose-parametre key.startsWith(paramPrefix+"diagnoser")}.groupBy { key, val -> // grupper på rader key.substring(0,"diagnoser[0]".size())}.findAll { rowKey, rowMap -> // Fjern tomme rader rowMap.any { key, val -> val && val != "null" }}.inject([:]) { acc, key, val -> // ungroup rader (tilbake til en map med parametre) acc + val}.collectEntries { key, val -> // hent sykdomskode.id if (key.endsWith('.sykdomskode') && val) { [key+'.id', Sykdomskode.findByNr(val)?.id ?: ""] } else { [key, val] }}.sort { it.key}

Page 33: Groovy collection api

more...

groovy.codehaus.org

meetup.com/Oslo-Groovy-Meetup

Page 34: Groovy collection api

questions ?

Page 35: Groovy collection api

Ubrukt

Page 36: Groovy collection api

sample data@EqualsAndHashCode @ToString class Person { def name, address, pets }@EqualsAndHashCode @ToString class Address { def street, city }enum Pet { CAT, DOG, BIRD, DUCK }import static Pet.*def persons = [ new Person(name:"Ole", address:new Address(street:"Blindvn 1", city:"Oslo"), pets:[BIRD, CAT]), new Person(name:"Dole", address:new Address(street:"Blindvn 2", city:"Oslo"), pets:[DOG, CAT]), new Person(name:"Doff", address:new Address(street:"Strandvn 9", city:"Bergen"), pets:[BIRD, DOG]), ]assert persons.pets == [ [BIRD, CAT], [DOG, CAT], [BIRD, DOG]] assert persons.pets.flatten().unique() == [BIRD, CAT, DOG]assert persons.address.city.unique() == ["Oslo", "Bergen"]

Page 37: Groovy collection api

real-world exampleimport org.ccil.cowan.tagsoup.Parser@Grab(group='org.ccil.cowan.tagsoup', module='tagsoup', version='0.9.7')

def gdocHome = "http://groovy.codehaus.org/groovy-jdk/"def gdocs = ["java/lang": ["Object[]","Object"], "java/util": ["Collection", "List", "Map"]]

gdocs.inject([:]) { agg, key, val -> // create map of [class:url] agg + val.collectEntries { [it, gdocHome + key+"/"+it+".html" ] }}.collectEntries { className, url -> // parse urls def html = new XmlParser(new Parser()).parse(url) [className, html.body.table[1].tr[1..-1].collect { it.td[1].code.b.a.text() }]}

Page 38: Groovy collection api

• gå dypt i utvalgte kall, ex

• groupBy

• inject

• findResult: find + transform

• nested collections: collectNested

Page 39: Groovy collection api

Groovy Collection Jdk Doc

• Object

• Object[]

• Collection

• Map

• List

• Set

Page 40: Groovy collection api

Basic collection types

assert [] instanceof ArrayList // (java.util)assert [:] instanceof LinkedHashMap // predictable order assert ([] as Set) instanceof HashSetassert (1..3) instanceof IntRange // groovy.langassert (1..3) instanceof List