Groovy что это


Groovy за 15 минут – краткий обзор / Хабр

Groovy — объектно-ориентированный язык программирования разработанный для платформы Java как альтернатива языку Java с возможностями Python, Ruby и Smalltalk.

Groovy использует Java-подобный синтаксис с динамической компиляцией в JVM байт-код и напрямую работает с другим Java кодом и библиотеками. Язык может использоваться в любом Java проекте или как скриптовый язык.

Возможности Groovy (отличающие его от Java):

— Статическая и динамическая типизация
— Встроенный синтаксис для списков, ассоциативных массивов, массивов и регулярных выражений
— Замыкания
— Перегрузка операций

[http://ru.wikipedia.org/wiki/Groovy]

Более того, почти всегда java-код — это валидный groovy-код.

Установка

Для установки нужно скачать архив с оф. сайта , распаковать его в удобное место и добавить переменyю окружения GROOVY_HOME, и добавить путь до groovy/bin в PATH:

export GROOVY_HOME=~/path/to/groovy/ export PATH=$GROOVY_HOME/bin:$PATH 

В IDE NetBeans 7. 0 поддержка groovy идет из коробки, для IDE Eclipse существует очень хороший плагин, который можно взять здесь.

Groovy

Самое главное отличие от java: в Groovy всё является объектами. Все примитивные типы сразу же упаковываются в объекты. Т.е. «int x» на самом деле является «Integer x»

println 1.class int a = 10 println a.class 
class java.lang.Integer class java.lang.Integer 

Следует не забывать о том, что все упаковочные типы — неизменяемые, поэтому каждый раз при каком-либо вычислении будет создаваться новый объект.

Строки в Groovy

1) Java Strings — строки в одинарных кавычках
2) Groovy Strings, они же GStrings — в обычных кавычках
В строках groovy можно вставлять параметры, в обычные строки — нельзя

javaString = 'java' groovyString = "${javaString}" j = '${javaString}' bigGroovyString = """ ${javaString} ${groovyString} ${j} ${2 + 2} """ println bigGroovyString 
 java java ${javaString} 4 

К строкам применимы операции + и *

groovy:000> a = "a" ===> a groovy:000> a + "123" ===> a123 groovy:000> a * 5 ===> aaaaa 

Так же к строкам применимы ++ и - — (т. a$ region=0,1 lastmatch=]

Встроенная поддержка maps + lists

Так же на уровне конструкций языка поддерживаются словари (maps) и списки:

groovy:000> a = [1, 3, 5] ===> [1, 3, 5] groovy:000> b = [1: true, 0: false] ===> {1=true, 0=false} 

Ranges

Получать доступ к элементам списков в groovy можно следующим образом:

groovy:000> a = "0123456789" ===> 0123456789 groovy:000> a[1..4] ===> 1234 groovy:000> a[1..-1] ===> 123456789 groovy:000> a[-1..0] ===> 9876543210 groovy:000> a[1..<9] ===> 12345678 groovy:000> a[1, 3, 5] ===> 135 groovy:000> b = 1..5 ===> 1..5 groovy:000> a[b] ===> 12345 

Range — это такой же объект, поэтому возможны конструции, подобные последней. Отрицательные индексы, как в python, возвращают элементы с конца списка.

Range можно составить из строк:

groovy:000> 'a'. .'aa' ===> a..aa 

Более того, range можно сделать из любого объекта, у которого есть методы next() и prev().

Циклы

Циклы в groovy точно такие же, как и в java, плюс к ним добавляется еще один «foreach»:

for (i in 0..9) { print i } for (int i = 0; i < 9; ++i) { print i } for (Integer i : 0..9) { print i } 

Функции

def functionA(argA) { print ArgA } int functionB(int argB) { print argB return argB } String fuctionC() { "Hello World" } 

Ключевое слово return указывать не обязательно — по умолчанию будет возвращено значение последней упомянутой переменной в фукции.

Closures

Closure — это анонимная функция

def cl = {a, b -> println a println b } cl(1, 2) 

У многих объектов есть методы, в качестве параметров которым передаются closure:

1.upto 10, { print it } 10.times { print it } 

Доступно большое количество методов для обработки последовательностей, к которым можно применять замыкания:

'qwerty'. each { print it } ('a'..'z').each { print it } ('a'..'z').findAll { el -> // = filter el in ['e', 'y', 'u', 'i', 'o', 'a'] }.each { print it + ' ' } (0..10).collect { el -> // = map el * 10 }.each { print it + ' ' } def sum = (0..10).inject(0) { prev, elem -> // = reduce return prev + elem } 

В closure так же не обязательно использовать ключевое слово return. Если явно не задано имя параметру, то по умолчанию используется it.

Так как closure является объектом, то ничего не мешает возвращать его из другого closure, и таким образом создавать функции высших порядков:

def cloA = {param -> def cloB = { return param * 10 } } def b = cloA(10) println b(10) 

Файлы

Для директорий есть функции eachFile и eachFileRecursive:

new File('.').eachFile { println it } 
./.project ./src ./.settings ./.classpath ./bin 

Для обработки текстовых файлов — функция eachLine:

new File('textfile. txt').eachLine { println it } 

Писать в файлы так же очень удобно:

def pw = new File('textfile.txt').newPrintWriter() pw.println("new line") 

Классы




class Account { String name BigDecimal value } // конструктор по умолчанию добавляется автоматически // такой конструктор - синтаксический сахар для // a = new Account() // a.setName("Account #1") // a.setValue(new BigDecimal(10)) a = new Account(name : "Account #1", value : new BigDecimal(10)) // геттеры и сеттеры генерируются автоматически def name = a.getName() a.setName("Account #2") println "${a.name}" class Person { def first def last // явно задаем сеттер void setFirst(first) { println "${this.first} is becoming ${first}" this.first = first } } p = new Person(first : "A", last : "G") // если обращаться к полю, то будет использоваться сеттер p.first = "C" println "${p.first} ${p.last}" // наследвание как в java class ExtendedAccount extends Account { def debt // задаем конструктор ExtendedAccount(name, value, debt) { setName(name) setValue(value) setDebt(debt) } def String toString() { "${name} ${value} ${debt}" } } // тут будет ошибка "Could not find matching constructor for: ExtendedAccount()" //e = new ExtendedAccount() println new ExtendedAccount("A", new BigDecimal(10), 1) 

Неизменяемые классы задаются с помощью аннотации Immutable:

@Immutable class ImmutableClass { String a Integer b } def ic = new ImmutableClass(a : "a", b : 1) 

При использовании этой аннотации нужно явно указывать, какого типа данных поле.

Операторы

"?:" Elvis operator

def b = a ?: "b" 

Проверяет переменную a, и если в ней null или false, то берет указанное следом значение. Иначе берется значение переменной a.

"?." Safe navigation
Используется для избежания ошибки NullPointerException

def user = Users.get("a") def posts = user?.posts println posts 

Вернет null, если если в user содержится null вместо того, чтобы бросать NullPointerException.

"*." Spread operator
Применяет указанный метод для всех элементов какой-либо коллекции. Эквивалент следующему:

parent*.action == parent.collect {ch -> child?.action} 

Пример использования:

def sizes = ['string', 'long string']*.size() println sizes 
[6, 11] 

Так же монжо использовать для составления списков и словарей:

def x = [2, 3] def y = [0, 1, *x, 4] println y def a = [3 : 'c', 4 : 'd'] def b = [1 : 'a', 2: 'b', * : a, 5 : 'e'] println b 
[0, 1, 2, 3, 4] [1:a, 2:b, 3:c, 4:d, 5:e] 

В Groovy можно перегружать операторы +, -, * и т. п. Для этого нужно определить соотвествующий метод для класса. Например, для перегрузки оператора ++ нужно переопределить метод next():

class RandomVal { // для этого поля не будут сгенерированы сеттеры и геттеры private def value private Random randomGen = new Random() def next() { this.value = randomGen.nextInt() } RandomVal() { this.value = randomGen.nextInt() } def String toString() { "${this.value}" } } def r = new RandomVal() println(r) r++ println(r) 

Оператор "==" уже перегружен для всех объектов — и вызывает метод «isEquals()». Полный список методов, которые нужно переопределить для перегрузки операторов, доступен здесь: http://groovy.codehaus.org/Operator+Overloading.

SQL

SQL запросы обрабатываются очень просто:

import groovy.sql.Sql def final ADDRESS = "jdbc:jtds:sqlserver://serverName/dbName" def final USERNAME = "username" def final PASSWD = "password" def final DRIVER = "net. sourceforge.jtds.jdbc.Driver" sql = Sql.newInstance(ADDRESS, USERNAME, PASSWD, DRIVER) sql.eachRow("select * from tableName") { el -> println "${el.id} -- ${el.firstName}" } def firstName = "A" def lastName = "G" sql.execute("insert into tableName (firstName, lastName) " + "values (${firstName}, ${lastName})") sql.execute("insert into tableName (firstName, lastName) " + "values (?, ?)", [firstName, lastName]) 

XML

В groovy существуют билдеры, которые можно использовать для генерации XML. Для генерации создается экземпляр объекта MarkupBuilder, на котором вызываются псевдо-методы — название этого метода и переданные параметры будет использоваться для генерации тега:

import groovy.xml.MarkupBuilder def mb = new MarkupBuilder() mb.html() { head() { title("This is the title") } body() { div("class" : "main") { p("this is the body") } } } 

Вывод:

<html> <head> <title>This is the title</title> </head> <body> <div> <p>this is the body</p> </div> </body> </html> 

В качестве параметра конструктору MarkupBuilder можно передавать любой PrintWriter:

def fb = new MarkupBuilder(new File("index. html").newPrintWriter()) 

Парсинг XML так же очень простой:

import groovy.xml.MarkupBuilder import java.io.StringWriter def sw = new StringWriter() def mb = new MarkupBuilder(sw) mb.html() { body() { div("class" : "main") { p("this is the body") } div() { p("this is the body 1") p("this is the body 2") p("this is the body 3") } } } def xml = sw.toString() println xml import groovy.util.XmlParser; def parser = new XmlParser() def doc = parser.parseText(xml) //def doc = parser.parse("index.html") println doc.body.div[1].p[1] // возвращает Node println doc.body.div[1].p // возвращает список, состоящий из Node println doc.body.div["@class"] // список значений аттрибута class для всех div 

Вывод:

<html> <body> <div> <p>this is the body</p> </div> <div> <p>this is the body 1</p> <p>this is the body 2</p> <p>this is the body 3</p> </div> </body> </html> p[attributes={}; value=[this is the body 2]] [p[attributes={}; value=[this is the body 1]], p[attributes={}; value=[this is the body 2]], p[attributes={}; value=[this is the body 3]]] [main, null] 

Groovlets

С помощью класса GroovyServlet возможно запускать скрипты на Groovy как сервлеты.
В первую очередь, для этого нужно добавить несколько строчек в web.xml:

<servlet> <servlet-name>GroovyServlet</servlet-name> <servlet-class>groovy.servlet.GroovyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>GroovyServlet</servlet-name> <url-pattern>*.groovy</url-pattern> </servlet-mapping> 

Теперь все запросы для файлов .groovy будут обрабатываться классом GroovyServlet.
В этих скриптах уже доступны для использования следующие переменные:

— request & response
— context, application, session
— out (= response.getWriter())
— sout (= response.getOutputStream())
— html (= new MarkupBuilder(out))

html.html() { body() { div("class" : "main") { p("this is the body") } div() { p("this is the body 1") p("this is the body 2") p("this is the body 3") } } } 

Отдаст браузеру сгенерированную html-страницу.

Список используемых источников:

Kenneth Barclay, John Savage «Groovy programming: an introduction for Java developers»
http://groovy.codehaus.org/

Хочу всё знать: язык Groovy | GeekBrains

Прорыв 2016 года.

2 минуты

34600

Автор статьи

Илья Бубнов

Автор статьи

Илья Бубнов

https://gbcdn.mrgcdn.ru/uploads/post/866/og_cover_image/f0b8551b33c9922cefc4d49956e9dfe4

 

Если вы никогда не слышали о языке программирования Groovy, то сейчас самое подходящее время начать им интересоваться. Всё дело в том, что в рейтинге TIOBE, основанном на популярности языков в поисковых системах, Groovy занял 18 место, обойдя за последний год уже знакомые нам Dart и R и вплотную приблизившись к индексам Visual Basic и Object Pascal.

Так что в этом языке такого удивительного и почему только сейчас, спустя 13 лет после своего создания, он начал подбираться к лидирующим позициям?

Краткая справка

Прежде чем понять феномен Groovy, обратимся к моменту его создания. Впервые он был упомянут в 2003 году, как язык, дополняющий Java с возможностями Python, Ruby и Smalltalk. Надо понимать, что в то время Java уже был самым популярным языком программирования, поэтому разработчики пытались придумать не замену, а скорее улучшение.

Так Groovy оказался в компании Java-подобных языков, среди которых также выделялся Scala. Вплоть до 2015 года именно последнему прочили стать заменой Java (самое удивительное, что эти слова принадлежат никому иному, как создателю Groovy Джеймсу Стрэчену), но судьба похоже распорядилась иначе.

Преимущества

Спросив любого человека, который имеет опыт работы с Groovy, вы узнаете, что главное преимущество Groovy – это то, что он спокойно «проглатывает» программы на Java. Если искать сравнение в графике, то Groovy – это новый слой, который, с одной стороны, основывается на исходном изображении и может его в точности повторять, а с другой – способен на качественные преобразования исходника.

Впрочем, есть и реальные полезности, как то возможность использовать замыкания, статическая и динамическая типизации или специальный синтаксис для работы с массивами, списками и регулярными выражениями. Однако именно «бесшовное» сопряжение с Java, сдобренное относительной легкостью изучения, помогло Groovy найти отклики в сердцах программистов.

Что касается стремительного взлёта за последний год, то основной причиной послужил переход под знамена Apache Foundation в мае 2015 года. Сразу после этого, многие ведущие технологические компании, опираясь на репутацию Apache, начали на постоянной основе внедрять и использовать Groovy в качестве одного из инструментов. И стоит признать, от этого сотрудничества пока все в выигрыше.

Кому стоит учить

Всем, кто хочет быть на передовой, чья профессия связана с Java, тестировщикам и тем, кто хочет просто немного расширить свои горизонты. А может вам просто надоело работать со Scala, как например вице-президенту Twitter.

Что почитать

Как всегда, начинаем с перечисления ресурсов от производителя:

http://www.groovy-lang.org — официальный сайт. Если вы последний раз заходили сюда пару лет назад, то сильно удивитесь, как косметическим преобразованиям, так и разделу под названием Documentation. В Apache Foundation быстро нашли причину ранней непопулярности Groovy и поспешили снабдить пользователя всей необходимой информацией;

https://dl.bintray.com/groovy/maven/apache-groovy-binary-2.4.7.zip — дистрибутив Groovy;

http://www.groovy-lang.org/events.html — важные мероприятия, посвящённые Groovy. В России они, к сожалению, пока не проводятся, зато если соберётесь в отпуск заграницу – не забудьте заглянуть и поинтересоваться, нет ли поблизости какой конференции.

Далее перейдем к хорошим книгам:

Grails. Гибкость Groovy и надежность Java, Глен Смит, Питер Ледбрук – прекрасная книга, посвященная главному фреймворку Groovy с массой практических уроков. Преимущественно для веб-разработчиков;

Groovy и Grails. Практические советы, Башар Абдул-Джавад – не столь увлекательное чтиво по сравнению с предыдущим (субъективно), но также будет иметь практическую ценность;

Making Java Groovy, Кеннет Коузен — книга, ориентированная на Java-разработчиков, которым захотелось сделать свою жизнь чуть проще.

Завершим знакомство с Groovy сторонними, но от того не менее полезными ресурсами:

https://habrahabr.ru/post/122127/ — всего за 15 минут вы прочитаете и усвоите основны Groovy.

https://ru.wikibooks.org/wiki/Groovy — довольно неплохой викиучебник на русском языке;

Testing with Groovy — если вы тестировщик и всё ещё читаете этот текст, то эта ссылка специально для вас;

https://plus.google.com/communities/105160926044623621768 — сообщество «груверов» на Google+.

 

groovyjavaязыки программированияjava_developer

Нашли ошибку в тексте? Напишите нам.

Что такое Groovy?

спросил

Изменено 3 года, 10 месяцев назад

Просмотрено 17 тысяч раз

У меня есть коллекция, которую я обрабатываю с помощью removeIf {} в Groovy. Внутри блока у меня есть доступ к некоторым идентификаторам и . Что это такое и где это задокументировано?

  • отличный

1

it — это неявная переменная, которая предоставляется в замыканиях. Он доступен, когда у замыкания нет явно объявленного параметра.

Когда замыкание используется с методами сбора, такими как removeIf , оно будет указывать на текущий элемент итерации.

Это похоже на то, что вы объявили это:

 List integers = [1, 2, 3] for(Integer it: integers) {print(it)} 

Когда вы используете вместо каждого , вместо этого (и это пример) вы можете получить it неявно предоставленным:

 integers.each{print(it)} // это задано по умолчанию 

Или

 integers.removeIf{it % 2 == 0} //это аргумент для Predicate.test() 

it будут последовательно принимать значения 1 , 2 и 3 по ходу итераций.

Можно, конечно, переименовать переменную, объявив параметр в замыкании:

 целых чисел.каждый{моецелое -> печать(моецелое)} 

В этом случае Groovy не предоставляет неявную переменную it . В документации есть более подробная информация

3

Если вы создаете замыкание без явного списка аргументов, по умолчанию используется один аргумент с именем it . Вот пример, который можно запустить в консоли Groovy

 Closure incrementBy4 = { it + 4 } // Проверь это утверждать incrementBy4(6) == 10 

В приведенном выше примере закрытие идентично

 Закрытие incrementBy4 = { it -> it + 4 } 

Вот еще один пример, использующий removeIf

 Closure remove2 = { it == 2 } числовые значения = [1, 2, 3] числа.removeIf (удалить2) // проверяем, что все сработало, как ожидалось утверждать числа == [1, 2] 

1

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя адрес электронной почты и пароль

Опубликовать как гость

Электронная почта

Требуется, но никогда не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Что такое "Groovy" и "Grails" и какие приложения создаются с их использованием?

спросил

Изменено 4 года назад

Просмотрено 85 тысяч раз

Сейчас я много слышу о "Groovy на Grails" и хочу узнать о нем больше:

  • Что такое Groovy?
  • Что такое Grails?
  • Какие приложения создаются с помощью Groovy на платформе Grails?
  • Grails
  • Groovy

4

  1. Что такое Groovy в Grails?

    Под этим именем больше не существует. Сейчас он называется просто Grails .

  2. Что такое Groovy?

    Первоначально динамический язык для JVM. Однако, начиная с Groovy 2.0, поддерживается как статическая, так и динамическая типизация.

  3. Что такое Grails?

    Grails (ранее известный как Groovy on Grails) — это среда программирования, основанная на Groovy и вдохновленная Ruby on Rails (есть различия, но есть и много общего). Как и RoR, Grails пропагандирует «кодирование по соглашению», передовой опыт разработки и предназначен для обеспечения высокой производительности.

  4. Какие приложения создаются с помощью "Groovy на Grails"?

    Grails используется для создания веб-приложений, работающих на JVM.

  5. Каковы преимущества Groovy на Grails?

    Высокая производительность, сосредоточение внимания на бизнесе, а не на сантехнике. (Обратите внимание, что я бы не рекомендовал использовать Grails с существующей моделью данных. Причина этого в том, что Grails поощряет нисходящий подход, при котором модель ER баз данных возникает как результат классов предметной области. Если вы используете устаревшую база данных, вы не можете использовать этот подход. Вы должны сопоставить базу данных с классами домена, и, вероятно, соглашение об именах не будет соответствовать, что делает необходимым использование файлов конфигурации или аннотаций Hibernate hbm.xml. IMO, это нетривиальное изменение в рабочем процессе это может стать очень громоздким, и в конечном итоге вы потеряете большинство преимуществ Grails.)

  6. Зачем использовать Groovy на Grails, когда у нас есть стандартные языки программирования, такие как C/C++, Java/J2EE и .NET/C#?

    Из-за пункта 5.

5

Groovy — это объектно-ориентированный язык программирования для платформы Java. Это динамический язык с функциями, аналогичными Python, Ruby, Perl и Smalltalk. Его можно использовать в качестве языка сценариев для платформы Java. Groovy имеет синтаксис, подобный Java, и без проблем работает с байт-кодом Java.

Другие функции включают в себя:

  • Простота обучения
  • Поддержка доменных языков
  • Компактный синтаксис
  • Поддержка динамического ввода
  • Мощные примитивы обработки
  • Простота разработки веб-приложений
  • Поддержка модульного тестирования.

Grails — это платформа веб-приложений с открытым исходным кодом, использующая язык программирования Groovy. Он задуман как высокопроизводительная среда, следуя парадигме «кодирование по соглашению», предоставляя автономную среду разработки и скрывая от разработчика большую часть деталей конфигурации.

Как и Rails, Grails кажется тем, что я называю "сильно гранулированным". Если вы делаете что-то в стиле Grails, разработка становится легкой (и, как правило, довольно быстрой). Фреймворк, как правило, имеет предпочтительный способ выполнения большинства задач. С другой стороны, если вам нужно идти против течения, вам придется сравнительно тяжело.

И не говорите Groovy на Grails (не существует), по причинам, указанным в этом блоге.

Grails является прямым аналогом Ruby on Rails, но работает с Groovy. Что такое Groovy? Это язык сценариев, который работает на виртуальной машине Java (JVM).

Таким образом, вы можете использовать библиотеки Java, которые у вас уже есть или доступны (поскольку они скомпилированы в байт-код и, таким образом, работают на JVM), а также мощность JVM (для сборки мусора, скорость с помощью JIT-компиляции и т. д. ) и лаконичность Groovy. Кривая обучения Java-программиста для изучения Groovy должна быть довольно небольшой (таким образом, используя огромное количество доступных Java-программистов).

Это совершенно другой способ создания веб-приложений по сравнению со стандартными механизмами Java для программирования сервлетов, JSP, Java Server Faces и т. д. Grails (например, Ruby on Rails) обещает более динамичную и итеративную среду разработки, чем стандартные механизмы разработки (будь то правда на практике , не подскажу)

2

Grails — платформа MVC для разработки веб-приложений и готовая к написанию кода платформа с DRY (не повторяйтесь), созданная на основе Spring+Hibernate.


Learn more

Только новые статьи

Введите свой e-mail

Видео-курс

Blender для новичков

Ваше имя:Ваш E-Mail: