Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

1 Podstawy Groovy: typy, operacje, sterowanie © Krzysztof Barteczko, PJWSTK 2012-2015.

Podobne prezentacje


Prezentacja na temat: "1 Podstawy Groovy: typy, operacje, sterowanie © Krzysztof Barteczko, PJWSTK 2012-2015."— Zapis prezentacji:

1 1 Podstawy Groovy: typy, operacje, sterowanie © Krzysztof Barteczko, PJWSTK

2 2 2 Skrypty Co to są skrypty i języki skryptowe ? Zastosowania: - programy uniwersalne - makra w systemach (aplikacjach) - integracja Integracja: - skrypty działające w ramach systemu - skrypty - łaczniki między różnymi aplikacjami - skrypty w Internecie i mashupy No hard-and-fast definition of what a scripting language is exists, but generally scripting languages are interpreted languages that feature higher productivity than more traditional systems languages. Scripting languages are glue languages. They stitch together existing software, such as objects, components, widgets, operating system commands, programs, functions, and other forms of existing code. Scripting languages are higher-level than traditional programming languages because they more easily leverage existing software. Cytaty: The Quiet Revolution:Open Source Scripting by Howard Fosdick 2009 Perl, Python, REXX, Ruby, PHP,... VBScript, WinScripting, AppleScripting

3 3 3 Groovy * is an agile and dynamic language for the Java Virtual Machine * builds upon the strengths of Java but has additional power features inspired by languages like Python, Ruby and Smalltalk * supports Domain-Specific Languages and other compact syntax so your code becomes easy to read and maintain * makes writing shell and build scripts easy with its powerful processing primitives, OO abilities and an Ant DSL * increases developer productivity by reducing scaffolding code when developing web, GUI, database or console applications * seamlessly integrates with all existing Java objects and libraries * compiles straight to Java bytecode so you can use it anywhere you can use Java Cytat ze strony Groovy

4 4 4 Groovy Groovy = Java – "boiler plate code" + dynamiczne typowanie + dynamiczne wykonanie kodu (skryptowanie) + znacznie poszerzona funkcjonalność bibliotek + rozbudowane oraz modyfikowalne instrukcje sterujące + przeciążanie operatorów + przyjemna składnia dla kolekcji + domknięcia i elementy programowania funkcyjnego + latwe w użyciu parsery (XML/HTML, JSON) + rozbudowane rodzaje napisów i "templates" + wbudowane w składnię przetwarzanie wyr. regularnych + buildery (Swing, Ant, Html, Xml, JSON, Graphics...) + metaprogramowanie fazy kompilacji i wykonania + doskonałe wsparcie do tworzenia DSL

5 5 5 Skrypty w języku Groovy Skrypt: kod w jednym pliku źródłowym (lub jako napis w programie), nie ma potrzeby definiowania klas ani metod (ale można), nie ma potrzeby deklarowania zmiennych (ale można). Można łatwo pisać proste programy. Groovy: name = 'World' println "Hello $name" Java: public class Greeting { public static void main(String... args) { String name = "World"; System.out.println("Hello " + name); } Średnik: w Groovy można pomijać, gdy w jednym wierszu jedna instrukcja. Nawiasy w wywołaniu metody/ funkcji: można pomijać, gdy są argumenty wywołania.

6 6 6 Porównanie: Java a Groovy import java.util.*; public class PostfixFilter { public static List getIdsFromListWithPostfix(List list, String postfix) { List result = new ArrayList<>(); for (String name : list) { if (name.endsWith(postfix)) result.add(name); } return result; } public static void main(String[] args) { List names = new ArrayList<>(); names.add("AWA Warszawa"); names.add("AKR Kraków"); names.add("AWR Wroclaw"); names.add("\"xxx\" Warszawa"); String loc = "Warszawa"; List waw = getIdsFromListWithPostfix(names, loc); System.out.println("Znalezione dla " + loc + ": " + waw.size()); for (String name : waw) { String[] words = name.split(" +"); System.out.println(words[0]); } names = [ 'AWA Warszawa', 'AKR Kraków','AWR Wroclaw', '"xxx" Warszawa'] loc = 'Warszawa' waw = names.findAll { it.endsWith loc } println "Znalezione dla $loc: " + waw.size() waw.each { println it.tokenize()[0] }

7 7 Przykład praktyczny: kursy euro import groovy.swing.SwingBuilder def url = 'http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml' def rates = new XmlParser().parse(url) def map = [:] rates.Cube.Cube.Cube.each { = } new SwingBuilder().edt { frame(title: 'Euro rates', pack: true, visible: true) { panel() { comboBox(id: 'cb', border: titledBorder('Select currency'), prototypeDisplayValue: 'xxxxxxxxxxxxx', items: map.keySet().toList(), actionPerformed: { def cur = it.source.selectedItem lab.text = map[cur] }) label(id: 'lab', preferredSize: cb.preferredSize, border: titledBorder('Rate')) }

8 8 8 8 Instalacja 1. JDK z java.sun.com - program instalacyjny prowadzi za rękę 2. Dokumentacja z java.sun.com - unzip 3. Groovy z groovy.codehaus.org - unzip 4. (opcjonalnie) Wybrane IDE 5. Ustawić zmienne środowiskowe PATH, JAVA_HOME i GROOVY_HOME 6. Test: Zapisać program w pliku Start.groovy: println "I'm Groovy!" Z wiersza poleceń: groovy Start.groovy Na konsoli uzyskamy napis: I’m Groovy!

9 9 9 Praca z Eclipse Eclipse pobrać można ze strony eclipse.org. Pobrane archiwum wystarczy rozpakować na dysku. Należy też doinstalować plug-in dla języka Groovy (“Software updates”). Na starcie Eclipse wybieramy Workspace - czyli obszar roboczy. Jest to wybrany przez nas katalog, w którym będą nasze programy. Workspace zawiera projekty. Programy umieszczane są w projektach. Zatem sekwencja działań jest następująca: * uruchomić Eclipse, * wybrać Workspace, * utworzyć nowy projekt (”Groovy project"), * w danym projekcie utworzyć program (”Groovy class").

10 10 Literały liczbowe: Literały napisowe: 'Hello Groovy' '1‘ /I'm slashy string\x/ "I'm Gstring $v" '''Multiline string''' """Multiline GString $x = $y""" Znaki - kodowanie Unicode Literały boolowskie - słowa kluczowe: true false W Groovy literały są obiektami odpowiednich klas, np. 1 - typ (klasa) Integer typ BigDecimal 'x' - typ String '1' - typ String 'ala ma kota' - typ String "ala ma kota" - typ GString Integer - całkowite od do BigDecimal - dowolnie duże liczby z dowolną precyzją

11 11 Literały - znaki specjalne print '\u03b1\u03b2\u03b3 ' print '\\' print '\'' print " alfa beta gamma '" println '\nalfa\nbeta\ngamma' println "c:\\util\\bak" println /c:\util\bak/ αβγ \' alfa beta gamma ' alfa beta gamma c:\util\bak Uwaga na: znaki specjalne, slashy string, różnice w działaniu print - bez przejścia do nowej linii, println - z przejściem By uzyskać na konsoli Eclipse znaki UTF: "Run Config-Common-Console Encoding" UTF-8 MODTFIKATORY float f = 1f, long l = 1L, double d = 1d, BigDecimal = 1g

12 12 Zmienne i dynamiczne typowanie W skryptach można nie deklarować zmiennych: x = 10 Deklaracja zmiennej: def lub użycie konkretnego typu. Zmienne nie zadeklarowane lub zadeklarowane z def są dynamicznie typowane: def x = 10 // typ: Integer x = 'Ala' // a teraz zmienił się na String Użycie konkretnego typu w deklaracji zmiennej wymusza zgodność typów (typ zmiennej nie może być zmieniony). Integer v = 1 v = 'Groovy' Błąd Zamiast nazwy typu - słowo def (deklaracja zmiennej dowolnego typu): def v = 1 v = 'Groovy' Ok Redeklaracje niedozwolone: def v... def v String s... Integer s Błędy

13 13 W Groovy wszystko jest obiektem. Gdy używamy liczb, napisów, znaków, wartości boolowskich odpowienie obiekty tworzone są automatycznie. W każdym innym przypadku musimy sami tworzyć obiekty za pomocą wyrażenia new, np. d = new Date() scanner = new Scanner(text) file = new File('c:/temp/text.txt') Argumenty wywołania konstruktorów Zmienne zawierają referencje do obiektów!

14 14 Hierarchie typów Typy są wyznaczane przez klasy i przez interfejsy. Klasy mogą dziedziczyć inne klasy i implementować interfejsy. Object Number extends Object Integer extends Number Literał 1 jest typu Integer i Number i Object Object AbstractMap extends Object implements Map HashMap extends AbstractMap Obiekt hash-mapa jest typu Object, Map, AbstractMap, HashMap

15 15 Typy proste W Javie oprócz typów obiektowych występują typy proste. W języku Groovy można używać typów prostych, ale dane tych typów są i tak przekształcane na obiekty odpowiadających im klas. byte b = 1 long l = char c = 'x' int i = 111 [ b, l, c, i ].each { println it.class.name } Wynik: java.lang.Byte java.lang.Long java.lang.Character java.lang.Integer Autoboxing!

16 16 Operatory arytmetyczne: * mnożenie / dzielenie + dodawanie - odejmowanie ** potęgowanie (G) % reszta z dzielenia ++ zwiększanie -- zmniejszanie Operatory relacyjne: < mniejsze <= mniejsze lub równe >= większe lub równe > większe == czy równe != czy nie równe Przypisania: = (i pochodne) Operatory logiczne: ! negacja || alternatywa && koniunkcja Operator instanceof: stwierdzenie typu: x instanceof A czy x jest typu A lub dowolnego jego podtypu Groovy pozwala na definiowanie operatorów w klasach i w wielu jego standardowych klasach jest to zrobione. I wiele innych ….

17 17 Operacje na liczbach - cechy szczególne Przy dzieleniu dwóch liczb całkowitych następuje promocja do BigDecimal i wynik jest zgodny z "arytmetyką". Java: 1/3 == 0 Groovy: 1/3 = Literały rzeczywiste są typu BigDecimal, wobec tego operacje są dokładne. Java: 3 * 0.2 != 0.6 Groovy: 3 * 0.2 = 6 Ciekawe - ULP (Unit of Least Precision, Unit in the Last Place) Potęgowanie: Java: konieczne użycie funkcji z klasy Math Groovy: operator **

18 18 Złożone operatory przypisania Złożone operatory przypisania mają postać: op= gdzie op - to jeden z operatorów * / % + – > >>> & ^ | Złożone operatory przypisania, stosowane w następujący sposób: x op= wyrażenie są wygodną formą skrócenia zapisu: x = x op ( wyrażenie ) gdzie: x - dowolna zmienna wyrażenie - dowolne wyrażenie op - symbol operatora Na przykład, zamiast: numOfChildren = numOfChildren + 2 możemy napisać: numOfChildren += 2

19 19 Zwiększanie i zmniejszanie ++ zwiększa -- zmniejsza Przyrostkowa forma operatorów (znak operatora po argumencie) modyfikuje wartość argumentu po jej wykorzystaniu w wyrażeniu. Przedrostkowa (znak operatora przed argumentem) - przed wykorzystaniem tej wartości. Np. def n, i = 1 n = i++ // przyrostkowa forma operatora ++ zmienna i zostanie zwiększona o 1, ale zmiennej n zostanie nadana wartość zmiennej i sprzed zwiększenia, czyli po wykonaniu instrukcji: n będzie równe 1, a i będzie równe 2. def n, i = 1; n = ++i; // przedrostkowa forma operatora ++ zmienna i zostanie zwięksozna o 1 i ta nowa jej wartosć zostanie przypsiana zmiennej n, czyli po wykonaniu instrukcji: n = 2, i = 2. o jeden wartość argumentu (zmiennej)

20 20 Rodzaje napisów w Groovy 'aa' "bb" 'aaaaa "oo" bb' "bbbbb 'cd' ef" "v = $v" "Today = ${new Date()}" "x[1] = ${x[1]}" '''first line second''' """multi line ev. Gstring""" /In slashy Strings you can use \ without escaping/ Gdy "..." i $ - GString z substytucją zmiennych i wyrażeń Napisy wielowierszowe 'Slashy' Strings

21 21 Rodzaje napisów w Groovy (2) Multiline slashy strings: def poem = / to be or not to be / Dollar slashy strings = slashy + GString: „multi-line GString similar to the slashy string, but with slightly different escaping rules. You are no longer required to escape slash (with a preceding backslash) but you can use '$$' to escape a '$' or '$/' to escape a slash if needed”. def town = "Warsaw" def dollarSlashy = $/ In $town, today is ${new Date() } normal $ dollar-sign $$town dollar-sign escaped \ backslash / slash $/$$ slash and dollar /$ println dollarSlashy In Warsaw, today is Tue Mar 13 05:05:05 CET 2012 normal $ dollar-sign $town dollar-sign escaped \ backslash / slash /$ slash and dollar

22 22 Łączenie napisów Do łączenia napisów służy operator + txt1 = 'Groovy' txt2 = 'an agile language' res = txt1 + ' is ' + txt2 // Groovy is an agile language Można dołączać inne dane (będą przekształcone na napisy): res = txt1 + ' number ' + 1 // Groovy number 1 now = new Date() res = 'Now is: ' + now // Now is: Sun Aug 09 05:24:07 CEST 2009 Użycie cudzysłowu daje GString (substytucja wyrażeń poprzedzonych $): res = "$txt1 is $txt2" // Groovy is an agile language res = "Now is: ${new Date()}" // Now is: Sun Aug 09 05:24:07 CEST 2009 Jeśli wyrażenie nie jest zmienną ujmujemy je w nawiasy klamrowe Uwaga: String na początku!

23 23 Proste działania na napisach A. Metody klasy String B. Dodatkowo Groovy: def s = 'abcdefegh' println s.size() println s[0] println s[1] println s[-1] println s[0..2] println s[0..<2] println s.reverse() println s[-1..0] println s.padLeft(15, '+') println s.padRight(15, '+') println s.center(15, '*') println s*2 println s - 'e' println s - 'abc' 9 a b h abc ab hgefedcba abcdefegh abcdefegh ***abcdefegh*** abcdefeghabcdefegh abcdfegh defegh Dostęp do znaków Podłańcuchy Specjalne operatory Proste działania na napisach A. Metody klasy String B. Dodatkowo Groovy: def s = 'abcdefegh' println s.size() println s[0] println s[1] println s[-1] println s[0..2] println s[0..<2] println s.reverse() println s[-1..0] println s.padLeft(15, '+') println s.padRight(15, '+') println s.center(15, '*') println s*2 println s - 'e' println s - 'abc' 9 a b h abc ab hgefedcba abcdefegh abcdefegh ***abcdefegh*** abcdefeghabcdefegh abcdfegh defegh

24 24 Konwersje napisy - liczby Pojedyncze znaki mają swoje liczbowe kody i mogą być traktowane jak liczby: char a = 'A' int kod = a println "$a - code: $kod" char c = '1' println "$c - code: " + (int) c kod++ c = (char) kod println "$c - code: $kod" a += 1 println a Po to by z napisu (a nie typu char) uzyskać liczbę, potrzebne są dodatkowe środki: s = '65' int v v = s v = s.toInteger() + 1 // Ok, 66 s.toDouble() s.toBigDecimal().... inne A - code: code: 49 B - code: 66 B Błąd wykonania Operator rzutowania

25 25 Błędy konwersji Gdy napis nie daje się potraktować jako liczba odpowiedniego typu występuje wyjątek NumberFormatException. Można go oczywiście obsłużyć (jak w Javie), ale w Groovy istnieje możliwość wcześniejszego sprawdzenia czy napis może być traktowany jako liczba odpowiedniego typu. def s1 = '10' def s2 = '1.1' println s1.isInteger() println s2.isDouble() println s2.isBigDecimal() println s1.isDouble() println s1.isBigDecimal() println s2.isInteger() println s1.isNumber() println s2.isNumber() Result: true false true Metody sprawdzania typu

26 26 Listy - wprowadzenie Lista - zestaw elementów, które mają określone pozycje w zestawie i mogą się powtarzać. Utworzenie listy w programie: list1 = ['A', 'B', 'C'] list2 = [1, 2, 3, 4, 5] list3 = [1, 'A', 2, 'B', new Date()] elist = [] // pusta lista Dostęp do elementów (indeksowanie od 0): println list1[0] // A list3[1] = 2 // teraz [1,2,2,B...] Liczba elementów na liście: list1.size() // == 3 Ost. element: list1[-1] // C Odwracanie: list1.reverse() lub list1[-1..0] Sublisty: list[1..2] // [ B, C ] list[-2..-1] // dwa ostatnie znaki Dodawanie elementów do listy: elist << 77 << 81 // teraz [77, 81] list1 += 'A' // teraz [A, B, C, A] Usuwanie elementów z listy: list1 -= 'A' // teraz [B, C] list2.remove(1) // teraz [1,3,4,5] Usuwa dany element Usuwa element o podanym indeksie Takie listy są typu: Collection, List i ArrayList.

27 27 Wieloprzypisania W jednej instrukcji przypisanie na wiele zmiennych (lista zmiennych) = dowolny obiekt z operatorem indeksowania (a, b) = [1, 2] (a, b) = [b,a] // swap (a, b) = 'ab'

28 28 Rozbiór tekstów def s1 = 'Groovy, Java - ok' def list = s1.tokenize() println list list = s1.tokenize(',-') println list Wynik: [Groovy,, Java, -, ok] [Groovy, Java, ok] Separatory = białe znaki ' \t\n\r\f' Separatory = podane

29 29 Łączenie elementów kolekcji w napisy String join(String separator) Concatenates the toString() representation of each item in this collection, with the given String as a separator between each item. String txt def list = [1,2,3,4] txt = list.join(' - ') println txt txt = ' a b c d' list = txt.tokenize() txt = list.join(' ') println txt Result: a b c d Ten sam efekt: txt = txt.tokenize().join(' ')

30 30 Interakcja z programem Wprowadzania danych: z konsoli za pomocą skanera (klasa Scanner) input = new Scanner(System.in).next...() z użyciem dialogu wejściowego input = JOptionPane.showInputDialog('Message') (wynikiem jest wprowadzony napis lub null, jeśli anulowano dialog) Pokazywanie wyników w okienku komunikatów JOptionPane.showMessageDialog(null, string)

31 31 Interakcja – przykład 1 import static javax.swing.JOptionPane.* (kwota, ods) = showInputDialog('Podaj kwote i oprocentowanie').tokenize() println "Kwota: $kwota" println "Oprocentowanie: $ods" kwota = kwota.toBigDecimal() ods = ods.toBigDecimal() println 'Po dodaniu odsetek kwota wynosi ' + (1+ods)*kwota

32 32 Interakcja - przykład 2 import static javax.swing.JOptionPane.* input = showInputDialog("Enter phrase") data = input.tokenize() println data println "Phrase contains ${data.size()} word(s)" println 'Enter line in console' input = new Scanner(System.in).nextLine() println input input = showInputDialog("Enter 2 integers") scan = new Scanner(input) sum = scan.nextInt() + scan.nextInt() showMessageDialog(null, "Sum: $sum") Rozbicie tekstu na słowa Skaner nałożony na String nextInt pobiera kolejny symbol i przekształca go w liczbę całkowitą [a, b, c] Phrase contains 3 word(s) Enter line in console Groovy lang Console

33 33 Mapy - wprowadzenie Mapa: zestaw par klucz-wartość Tworzenie w programie: map1 = [:] // pusta mapa map2 = [ Joan: ' ', Steve: ' '] map3 = [:].withDefault { 10 } // z domyślnymi wartościami Dostęp: map2.Joan // map2['Joan'] // map2.Dave // null name = 'Steve' map2[name] // map1['x'] = 7 map1.y = 23 map1.x + map1.y // 30 map3.x = 10 map3.x + map3.y // 30 Takie mapy są typu: Map i LinkedHasMap Zbior kluczy: map.keySet() Zbiór wartości: map.values() Kolekcja wejść: map.entries()

34 34 Interakcja - przykład 3 import static javax.swing.JOptionPane.* map2 = [ Joan: ' ', Steve: ' '] name = showInputDialog("Enter name:") tel = map2[name] showMessageDialog(null, "$name - tel. $tel")

35 35 Sterowanie if (..) { } if (…) { } else { } while(…) { } do { } while for (init; cond; upd) { } for (typ x : obj) { } for (x in obj) operator in switch(…) … Operator warunkowy Elvis-operator try { } catch { } finally {} throw exc Możliwe własne konstrukcje!

36 36 Warunki W Groovy warunkiem może być wyrażenie dowolnego typu (nie void). W momencie testowania warunku w takich instrukcjach jak if i while wyrażenie jest przekształcane do wartości boolowskiej (true lub false) wg. następującego schematu: Uwaga: w Javie warunkiem może być tylko wyrażenie typu boolean.

37 37 Porównania Operatory służące do porównań: >, =, <= wołana jest metoda a.compareTo(b) ==, != wołana jest metoda a.equals(b) def txt1 = 'Groovy', txt2 = 'Java' def x = 1, y = 10 def list = ['a', 'b', 'c'] def elist = ['a', 'b', 'c'] max = y if (x > y) max = x println max txt3 = 'G' txt3 += 'roovy' println txt2 > txt1 println txt1 == txt3 println list == elist 10 // bo x.compareTo(y) zwraca false true // bo 'Java'.compareTo('Grovy') zwraca wartość > 0 true // bo zawartość obiektów wskazywanych przez txt1 i txt2 jest taka sama true // bo list i elist ma tę samą zawartość Wyniki porównań zależą od definicji metod equals i compareTo w klasach obiektów.

38 38 Wyrażenia warunkowe Operator warunkowy ?: ma trzy argumenty - wyrażenia i stosowany jest do konstrukcji wyrażenia warunkowego w następujący sposób: e1 ? e2 : e3 // jeśli e1 daje true wynikiem jest e2, inaczej e3 Elvis-operator (skrót dla niektórych sytuacji) e1 ?: e2 // wynik: jeśli e1 daje true (np. !null) e1, inaczej e2 import static javax.swing.JOptionPane.*; name = showInputDialog('Enter name') userName = name ? name : 'Anonymous' // ternary println "User: $userName" name = showInputDialog('Enter name') ?: 'Anonymous' println "User: $name"

39 39 Zakresy Obiekty typu Range określają zakresy. Wprowadzamy je za pomocą operatorów.. lub..< Przykłady: // zestaw liczb od 1 do <10 // zestaw liczb od 1 do // zakres odwrócony (10, 9, 8,... 1) 'a'..'c' // litery a, b, c d1 = new Date() d2 = d1 + 7 d1..d2 // daty od dziś do za tydzień

40 40 Operator in Wyrażenie: e in ob użyte jako warunek (nie w iteracyjnym for) ma wartość true jeśli w klasie obiektu ob zdefiniowana metoda isCase() zwraca true. def r1 = def r2 = 'a'..'c' def d = new Date() def r3 = d..d + 7 def l = [1, 3, 7] def map = [ a: 1, b: 2] def s = 'xaz' println 3 in r1 println 11 in r1 println 'b' in r2 println 'z' in r2 println d + 3 in r3 println d + 10 in r3 println 3 in l println 'b' in map // isCase sprawdza zawartośc keySet println 'xaz' in s // isCase == equals // ale: println 'x' in s true false true false true false true false

41 41 Instrukcja switch switch(candidate) { case classifier1 : code [ break ]... case classifierN : code; [ break] default : code } Przykład: switch(e) { case 1 : println "$e - one"; break case 'Groovy' : println "$e - lang"; break case 'a'..'z' : println "$e - in range"; break case [ 'ala', 'kot'] : println "$e - in list"; break case [ klucz1: 1, klucz2: 2] : println "$e - key in map"; break case BigDecimal : println "$e - BigDecimal"; break default: println "$e - Don't know it" } Wynik: if (e== 1) 1 - one if (e == 'Groovy') Groovy - lang if (e == 'x') x - in range if ( e == 2.3) 2.3 – BigDecimal ala - in list klucz1 - key in map Do klasyfikatora której etykiety case pasuje kandydat? Tam przejdzie sterowanie. Jeśli nie ma break wykonywany jest kod następnej etykiety. Jeśli kandydat nigdzie nie pasuje - wykonywany jest kod etykiety default. switch (num) { case 1..3 : println 'Small' break case 4..7 : println 'Medium' break case : println 'Large' break default: println 'Undefined' } Decyduje isCase(candidate) z klasy obiektu case.

42 42 Instrukcja for-each Ma postać: for (var in iterable) ins gdzie: var - nazwa zmiennej iterable - obiekt iterowalny (np. zakres, lista, mapa, napis) ins - instrukcja Działanie: w każdym kroku pętli kolejny element obiektu iterowalnego (zestawu) jest podstawiany na zmienną var i wykonywana jest instrukcja ins (w której zazwyczaj sięgamy do zmiennej var) Zgodna z Javą postać tej instrukcji: for (Typ var : iterable) ins ma takie same działanie, ale wymaga podania typu zmiennej Gotowe iterable: Kolekcje Mapy Zakresy Napisy

43 43 For-each przykłady rng = sum = 0 for (x in rng) sum += x println sum list = [ 'a', 'b', 'c' ] list1 = [] for (elt in list) list1 << elt + 'X' println list1 for (x in [a:1, b:2, c: 3]) { println x println "$x.key $x.value" } low = 'a' up = 'd' for (c in up..


Pobierz ppt "1 Podstawy Groovy: typy, operacje, sterowanie © Krzysztof Barteczko, PJWSTK 2012-2015."

Podobne prezentacje


Reklamy Google