Учебники

Groovy — Краткое руководство

Groovy — Обзор

Groovy — это объектно-ориентированный язык, основанный на платформе Java. Groovy 1.0 был выпущен 2 января 2007 года, а Groovy 2.4 является текущим основным выпуском. Groovy распространяется через Apache License v 2.0.

Особенности Groovy

Groovy имеет следующие особенности —

  • Поддержка статической и динамической типизации.
  • Поддержка перегрузки оператора.
  • Собственный синтаксис для списков и ассоциативных массивов.
  • Встроенная поддержка регулярных выражений.
  • Встроенная поддержка различных языков разметки, таких как XML и HTML.
  • Groovy прост для разработчиков Java, поскольку синтаксис для Java и Groovy очень похожи.
  • Вы можете использовать существующие библиотеки Java.
  • Groovy расширяет объект java.lang.Object.

Официальный сайт Groovy: http://www.groovy-lang.org/

Groovy Официальный сайт

Groovy — Окружающая среда

Существует множество способов настройки среды Groovy.

Бинарная загрузка и установка — перейдите по ссылке www.groovy-lang.org/download.html, чтобы получить раздел установщика Windows. Нажмите на эту опцию, чтобы начать загрузку установщика Groovy.

Настройка среды Groovy

После того, как вы запустите установщик, следуйте инструкциям ниже, чтобы завершить установку.

Шаг 1 — Выберите язык установщика.

Установщик языка

Шаг 2 — Нажмите кнопку Далее на следующем экране.

Groovy 2.4.5 Настройка

Шаг 3 — Нажмите кнопку «Я согласен».

Лицензионное соглашение

Шаг 4 — Примите компоненты по умолчанию и нажмите кнопку Далее.

Выберите компоненты

Шаг 5 — Выберите подходящую папку назначения и нажмите кнопку Далее.

Место установки

Шаг 6 — Нажмите кнопку Установить, чтобы начать установку.

Папка меню Пуск

Шаг 7 — После завершения установки нажмите кнопку «Далее», чтобы начать настройку.

Установка завершена

Шаг 8 — Выберите параметры по умолчанию и нажмите кнопку Далее.

Переменные среды

Шаг 9 — Примите ассоциации файлов по умолчанию и нажмите кнопку Далее.

Файловые ассоциации

Шаг 10 — Нажмите кнопку Готово, чтобы завершить установку.

Кнопка Готово

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

Запуск команды Groovysh

Если вы хотите включить шпунтовые двоичные файлы как часть вашей сборки maven или gradle, вы можете добавить следующие строки

Gradle

'org.codehaus.groovy:groovy:2.4.5'

специалист

<groupId>org.codehaus.groovy</groupId> 
<artifactId>groovy</artifactId>  
<version>2.4.5</version>

Groovy — основной синтаксис

Чтобы понять основной синтаксис Groovy, давайте сначала рассмотрим простую программу Hello World.

Создание вашей первой программы Hello World

Создать свою первую программу hello world так же просто, как просто ввести следующую строку кода:

Live Demo

class Example {
   static void main(String[] args) {
      // Using a simple println statement to print output to the console
      println('Hello World');
   }
}

Когда мы запустим вышеуказанную программу, мы получим следующий результат —

Hello World

Заявление на импорт в Groovy

Оператор import может использоваться для импорта функциональности других библиотек, которые могут использоваться в вашем коде. Это делается с помощью ключевого слова import .

В следующем примере показано, как использовать простой импорт класса MarkupBuilder, который, вероятно, является одним из наиболее часто используемых классов для создания разметки HTML или XML.

import groovy.xml.MarkupBuilder 
def xml = new MarkupBuilder() 

По умолчанию Groovy включает в ваш код следующие библиотеки, поэтому вам не нужно явно импортировать их.

import java.lang.* 
import java.util.* 
import java.io.* 
import java.net.* 

import groovy.lang.* 
import groovy.util.* 

import java.math.BigInteger 
import java.math.BigDecimal

Жетоны в Groovy

Токен является ключевым словом, идентификатором, константой, строковым литералом или символом.

println(“Hello World”);

В приведенной выше строке кода есть два токена, первый — ключевое слово println, а следующий — строковый литерал «Hello World».

Комментарии в Groovy

Комментарии используются для документирования вашего кода. Комментарии в Groovy могут быть однострочными или многострочными.

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

class Example {
   static void main(String[] args) {
      // Using a simple println statement to print output to the console
      println('Hello World');
   }
}

Многострочные комментарии помечаются / * в начале и * / для обозначения конца многострочного комментария.

class Example {
   static void main(String[] args) {
      /* This program is the first program
      This program shows how to display hello world */
      println('Hello World');
   }
}

Точка с запятой

Как и в языке программирования Java, необходимо иметь точки с запятой, чтобы различать несколько операторов, определенных в Groovy.

class Example {
   static void main(String[] args) {
      // One can see the use of a semi-colon after each statement
      def x = 5;
      println('Hello World');  
   }
}

Приведенный выше пример показывает точки с запятой, используемые для различения строк кода.

Идентификаторы

Идентификаторы используются для определения переменных, функций или других пользовательских переменных. Идентификаторы начинаются с буквы, доллара или подчеркивания. Они не могут начинаться с цифры. Вот несколько примеров допустимых идентификаторов —

def employeename 
def student1 
def student_name

где def — это ключевое слово, используемое в Groovy для определения идентификатора.

Вот пример кода того, как идентификатор можно использовать в нашей программе Hello World.

class Example {
   static void main(String[] args) {
      // One can see the use of a semi-colon after each statement
      def x = 5;
      println('Hello World'); 
   }
}

В приведенном выше примере переменная x используется в качестве идентификатора.

Ключевые слова

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

как утверждать перерыв дело
ловить учебный класс Const Продолжить
Защита дефолт делать еще
перечисление продолжается ложный в заключение
за идти к если инвентарь
Импортировать в экземпляр интерфейс
новый вытащить пакет вернуть
супер переключатель этот бросать
бросает черта характера правда пытаться
в то время как

Пробелы

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

Например, в следующем примере кода между ключевым словом def и переменной x есть пробел. Это сделано для того, чтобы компилятор знал, что def — это ключевое слово, которое необходимо использовать, и что x должно быть именем переменной, которую необходимо определить.

def x = 5;

литералы

Литерал — это нотация для представления фиксированного значения в groovy. Groovy язык имеет обозначения для целых чисел, чисел с плавающей точкой, символов и строк. Вот некоторые примеры литералов на языке программирования Groovy:

12 
1.45 
‘a’ 
“aa”

Groovy — типы данных

На любом языке программирования вам нужно использовать различные переменные для хранения различных типов информации. Переменные — это не что иное, как зарезервированные области памяти для хранения значений. Это означает, что при создании переменной вы резервируете некоторое пространство в памяти для хранения значения, связанного с переменной.

Вам может потребоваться хранить информацию различных типов данных, таких как строка, символ, широкий символ, целое число, число с плавающей запятой, логическое значение и т. Д. На основе типа данных переменной операционная система выделяет память и решает, что можно сохранить в зарезервированном объем памяти.

Встроенные типы данных

Groovy предлагает широкий спектр встроенных типов данных. Ниже приведен список типов данных, которые определены в Groovy —

  • byte — используется для представления байтового значения. Пример 2.

  • короткий — используется для представления короткого номера. Пример 10.

  • int — Используется для представления целых чисел. Пример 1234.

  • long — используется для представления длинного числа. Примером является 10000090.

  • float — используется для представления 32-битных чисел с плавающей точкой. Пример 12,34.

  • double — используется для представления 64-битных чисел с плавающей запятой, которые являются более длинными представлениями десятичных чисел, которые иногда могут потребоваться. Пример 12.3456565.

  • char — определяет односимвольный литерал Примером является «а».

  • Boolean — Представляет логическое значение, которое может быть истинным или ложным.

  • Строка — это текстовые литералы, которые представлены в виде цепочки символов. Например, «Привет, мир».

byte — используется для представления байтового значения. Пример 2.

короткий — используется для представления короткого номера. Пример 10.

int — Используется для представления целых чисел. Пример 1234.

long — используется для представления длинного числа. Примером является 10000090.

float — используется для представления 32-битных чисел с плавающей точкой. Пример 12,34.

double — используется для представления 64-битных чисел с плавающей запятой, которые являются более длинными представлениями десятичных чисел, которые иногда могут потребоваться. Пример 12.3456565.

char — определяет односимвольный литерал Примером является «а».

Boolean — Представляет логическое значение, которое может быть истинным или ложным.

Строка — это текстовые литералы, которые представлены в виде цепочки символов. Например, «Привет, мир».

Связанные значения

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

байт От -128 до 127
короткая От -32 768 до 32 767
ИНТ От -2 147 483 648 до 2 147 483 647
долго От -9,223,372,036,854,775,808 до +9,223,372,036,854,775,807
поплавок От 1.40129846432481707e-45 до 3.40282346638528860e + 38
двойной 4.94065645841246544e-324d до 1.79769313486231570e + 308d

Числовой класс

Типы В дополнение к примитивным типам допускаются следующие типы объектов (иногда называемые типами-обертками):

  • java.lang.Byte
  • java.lang.Short
  • java.lang.Integer
  • java.lang.Long
  • java.lang.Float
  • java.lang.Double

Кроме того, следующие классы могут использоваться для поддержки арифметики произвольной точности —

название Описание пример
java.math.BigInteger Неизменяемые знаковые целые числа произвольной точности 30г
java.math.BigDecimal Неизменные знаковые десятичные числа произвольной точности 3.5g

В следующем примере кода показано, как можно использовать различные встроенные типы данных:

Live Demo

class Example { 
   static void main(String[] args) { 
      //Example of a int datatype 
      int x = 5; 
		
      //Example of a long datatype 
      long y = 100L; 
		
      //Example of a floating point datatype 
      float a = 10.56f; 
		
      //Example of a double datatype 
      double b = 10.5e40; 
		
      //Example of a BigInteger datatype 
      BigInteger bi = 30g; 
		
      //Example of a BigDecimal datatype 
      BigDecimal bd = 3.5g; 
		
      println(x); 
      println(y); 
      println(a); 
      println(b); 
      println(bi); 
      println(bd); 
   } 
}

Когда мы запустим вышеуказанную программу, мы получим следующий результат —

5 
100 
10.56 
1.05E41 
30 
3.5

Groovy — переменные

Переменные в Groovy могут быть определены двумя способами — с использованием собственного синтаксиса для типа данных или с помощью ключевого слова def . Для определения переменных обязательно либо явно указывать имя типа, либо использовать «def» вместо. Это требуется Groovy-парсером.

В Groovy есть следующие основные типы переменных, как объяснено в предыдущей главе:

  • byte — используется для представления байтового значения. Пример 2.

  • короткий — используется для представления короткого номера. Пример 10.

  • int — Используется для представления целых чисел. Пример 1234.

  • long — используется для представления длинного числа. Примером является 10000090.

  • float — используется для представления 32-битных чисел с плавающей точкой. Пример 12,34.

  • double — используется для представления 64-битных чисел с плавающей запятой, которые являются более длинными представлениями десятичных чисел, которые иногда могут потребоваться. Пример 12.3456565.

  • char — определяет односимвольный литерал Примером является «а».

  • Boolean — Представляет логическое значение, которое может быть истинным или ложным.

  • Строка — это текстовые литералы, которые представлены в виде цепочки символов. Например, «Привет, мир».

byte — используется для представления байтового значения. Пример 2.

короткий — используется для представления короткого номера. Пример 10.

int — Используется для представления целых чисел. Пример 1234.

long — используется для представления длинного числа. Примером является 10000090.

float — используется для представления 32-битных чисел с плавающей точкой. Пример 12,34.

double — используется для представления 64-битных чисел с плавающей запятой, которые являются более длинными представлениями десятичных чисел, которые иногда могут потребоваться. Пример 12.3456565.

char — определяет односимвольный литерал Примером является «а».

Boolean — Представляет логическое значение, которое может быть истинным или ложным.

Строка — это текстовые литералы, которые представлены в виде цепочки символов. Например, «Привет, мир».

Groovy также допускает дополнительные типы переменных, такие как массивы, структуры и классы, которые мы увидим в следующих главах.

Объявления переменных

Объявление переменной сообщает компилятору, где и сколько нужно создать хранилище для переменной.

Ниже приведен пример объявления переменной:

Live Demo

class Example { 
   static void main(String[] args) { 
      // x is defined as a variable 
      String x = "Hello";
		
      // The value of the variable is printed to the console 
      println(x);
   }
}

Когда мы запустим вышеуказанную программу, мы получим следующий результат —

Hello

Именование переменных

Имя переменной может состоять из букв, цифр и символа подчеркивания. Он должен начинаться либо с буквы, либо с подчеркивания. Прописные и строчные буквы различны, потому что Groovy, как и Java, является языком программирования с учетом регистра.

Live Demo

class Example { 
   static void main(String[] args) { 
      // Defining a variable in lowercase  
      int x = 5;
	  
      // Defining a variable in uppercase  
      int X = 6; 
	  
      // Defining a variable with the underscore in it's name 
      def _Name = "Joe"; 
		
      println(x); 
      println(X); 
      println(_Name); 
   } 
}

Когда мы запустим вышеуказанную программу, мы получим следующий результат —

5 
6 
Joe 

Мы можем видеть, что x и X — две разные переменные из-за чувствительности к регистру, а в третьем случае мы можем видеть, что _Name начинается с подчеркивания.

Переменные печати

Вы можете напечатать текущее значение переменной с помощью функции println. Следующий пример показывает, как этого можно достичь.

Live Demo

class Example { 
   static void main(String[] args) { 
      //Initializing 2 variables 
      int x = 5; 
      int X = 6; 
	  
      //Printing the value of the variables to the console 
      println("The value of x is " + x + "The value of X is " + X);  
   }
}

Когда мы запустим вышеуказанную программу, мы получим следующий результат —

The value of x is 5 The value of X is 6 

Groovy — Операторы

Оператор — это символ, который указывает компилятору выполнять определенные математические или логические манипуляции.

Groovy имеет следующие типы операторов —

  • Арифметические операторы
  • Реляционные операторы
  • Логические операторы
  • Битовые операторы
  • Операторы присваивания

Арифметические Операторы

Язык Groovy поддерживает обычные арифметические операторы как любой язык. Ниже приведены арифметические операторы, доступные в Groovy.

Показать пример

оператор Описание пример
+ Добавление двух операндов 1 + 2 даст 3
Вычитает второй операнд из первого 2 — 1 даст 1
* Умножение обоих операндов 2 * 2 даст 4
/ Деление числителя по знаменателю 3/2 даст 1,5
% Оператор модуля и остаток от целочисленного / делительного числа 3% 2 даст 1
++ Инкрементные операторы, используемые для увеличения значения операнда на 1

int x = 5;

х ++;

х даст 6

Инкрементные операторы, используемые для уменьшения значения операнда на 1

int x = 5;

Икс—;

х даст 4

int x = 5;

х ++;

х даст 6

int x = 5;

Икс—;

х даст 4

Реляционные операторы

Реляционные операторы позволяют сравнивать объекты. Ниже приведены реляционные операторы, доступные в Groovy.

Показать пример

оператор Описание пример
== Проверяет равенство между двумя объектами 2 == 2 даст истинное
знак равно Проверяет разницу между двумя объектами 3! = 2 даст истинное
< Проверяет, является ли левый объект меньше правого операнда. 2 <3 даст истинное
<= Проверяет, является ли левый объект меньше или равен правому операнду. 2 <= 3 даст истинное
> Проверяет, является ли левый объект больше правого операнда. 3> 2 даст истинное
> = Проверяет, является ли левый объект больше или равен правому операнду. 3> = 2 даст истинное

Логические Операторы

Логические операторы используются для оценки булевых выражений. Ниже приведены логические операторы, доступные в Groovy.

Показать пример

оператор Описание пример
&& Это логический оператор «и» true && true даст true
|| Это логический оператор «или» правда || правда даст правда
! Это логический оператор «не» ! ложь даст правду

Битовые операторы

Groovy предоставляет четыре побитовых оператора. Ниже приведены побитовые операторы, доступные в Groovy:

Показать пример

Sr.No Оператор и описание
1

&

Это побитовый оператор «и»

2

|

Это побитовый оператор «или»

3

^

Это побитовый «xor» или Exclusive или оператор

4

~

Это побитовый оператор отрицания

&

Это побитовый оператор «и»

|

Это побитовый оператор «или»

^

Это побитовый «xor» или Exclusive или оператор

~

Это побитовый оператор отрицания

Вот таблица истинности, демонстрирующая этих операторов.

п Q P & Q р | Q р ^ д
0 0 0 0 0
0 1 0 1 1
1 1 1 1 0
1 0 0 1 1

Операторы присваивания

Язык Groovy также предоставляет операторы присваивания. Ниже приведены операторы присваивания, доступные в Groovy.

Показать пример

оператор Описание пример
+ = Это добавляет правый операнд к левому операнду и присваивает результат левому операнду.

def A = 5

А + = 3

Выход будет 8

знак равно Это вычитает правый операнд из левого операнда и присваивает результат левому операнду

def A = 5

А- = 3

Выход будет 2

знак равно Это умножает правый операнд на левый операнд и присваивает результат левому операнду

def A = 5

А * = 3

Выход будет 15

знак равно Это делит левый операнд с правым операндом и присваивает результат левому операнду

def A = 6

А / = 3

Выход будет 2

знак равно Это берет модуль, используя два операнда и присваивает результат левому операнду

def A = 5

A% = 3

Выход будет 2

def A = 5

А + = 3

Выход будет 8

def A = 5

А- = 3

Выход будет 2

def A = 5

А * = 3

Выход будет 15

def A = 6

А / = 3

Выход будет 2

def A = 5

A% = 3

Выход будет 2

Операторы диапазона

Groovy поддерживает концепцию диапазонов и предоставляет нотацию операторов диапазона с помощью нотации. Простой пример оператора диапазона приведен ниже.

def range = 0..5 

Это просто определяет простой диапазон целых чисел, сохраняемый в локальной переменной под названием range с нижней границей 0 и верхней границей 5.

Следующий фрагмент кода показывает, как могут использоваться различные операторы.

Live Demo

class Example { 
   static void main(String[] args) { 
      def range = 5..10; 
      println(range); 
      println(range.get(2)); 
   } 
}

Когда мы запустим вышеуказанную программу, мы получим следующий результат —

Из оператора println вы можете видеть, что отображается весь диапазон чисел, определенных в операторе диапазона.

Оператор get используется для получения объекта из определенного диапазона, который принимает значение индекса в качестве параметра.

[5, 6, 7, 8, 9, 10] 
7

Приоритет оператора

В следующей таблице перечислены все операторы Groovy в порядке приоритета.

Sr.No Операторы и имена
1

++ — + —

предварительное увеличение / уменьшение, унарный плюс, унарный минус

2

* /%

умножение, деление, по модулю

3

+ —

сложение, вычитание

4

==! = <=>

равно, не равно, сравнить с

5

&

двоичный / побитовый и

6

^

двоичный / побитовый xor

7

|

двоичный / побитовый или

8

&&

логично и

9

||

логично или

10

= ** = * = / =% = + = — = << = >> = >>> = & = ^ = | =

Различные операторы присваивания

++ — + —

предварительное увеличение / уменьшение, унарный плюс, унарный минус

* /%

умножение, деление, по модулю

+ —

сложение, вычитание

==! = <=>

равно, не равно, сравнить с

&

двоичный / побитовый и

^

двоичный / побитовый xor

|

двоичный / побитовый или

&&

логично и

||

логично или

= ** = * = / =% = + = — = << = >> = >>> = & = ^ = | =

Различные операторы присваивания

Groovy — Петли

До сих пор мы видели операторы, которые выполнялись одно за другим последовательно. Кроме того, в Groovy предоставляются операторы для изменения потока управления в логике программы. Затем они классифицируются в поток контрольных операторов, которые мы рассмотрим подробно.

S.No. Заявления и описание
1 В то время как заявление

Оператор while выполняется сначала путем вычисления выражения условия (логическое значение), и, если результат равен true, выполняются операторы в цикле while.

2 для заявления

Оператор for используется для перебора набора значений.

3 Заявление о вступлении в силу

Оператор for-in используется для перебора набора значений.

Оператор while выполняется сначала путем вычисления выражения условия (логическое значение), и, если результат равен true, выполняются операторы в цикле while.

Оператор for используется для перебора набора значений.

Оператор for-in используется для перебора набора значений.

Заявления о контроле цикла

S.No. Заявления и описание
1 Перерыв Заявление

Оператор break используется для изменения потока управления внутри циклов и операторов switch.

2 Продолжить заявление

Оператор continue дополняет оператор break. Его использование ограничено циклами while и for.

Оператор break используется для изменения потока управления внутри циклов и операторов switch.

Оператор continue дополняет оператор break. Его использование ограничено циклами while и for.

Groovy — принятие решений

Структуры принятия решений требуют, чтобы программист указал одно или несколько условий, которые должны быть оценены или протестированы программой, вместе с оператором или инструкциями, которые должны быть выполнены, если условие определено как истинное , и, необязательно, другие операторы, которые должны быть выполнены, если условие определяется как ложное .

Sr.No. Заявления и описание
1 если заявление

Общая работа этого оператора состоит в том, что сначала условие вычисляется в операторе if. Если условие истинно, оно выполняет инструкции.

2 Оператор if / else

Общая работа этого оператора состоит в том, что сначала условие вычисляется в операторе if. Если условие истинно, оно затем выполняет операторы и останавливается до условия else и выходит из цикла. Если условие ложно, оно выполняет операторы в блоке оператора else и затем выходит из цикла.

3 Вложенный оператор If

Иногда существует требование иметь несколько операторов if, встроенных друг в друга.

4 Переключатель Заявление

Иногда вложенный оператор if-else настолько распространен и используется так часто, что был разработан более простой оператор, называемый оператором switch.

5 Вложенный оператор Switch

Также возможно иметь вложенный набор операторов switch.

Общая работа этого оператора состоит в том, что сначала условие вычисляется в операторе if. Если условие истинно, оно выполняет инструкции.

Общая работа этого оператора состоит в том, что сначала условие вычисляется в операторе if. Если условие истинно, оно затем выполняет операторы и останавливается до условия else и выходит из цикла. Если условие ложно, оно выполняет операторы в блоке оператора else и затем выходит из цикла.

Иногда существует требование иметь несколько операторов if, встроенных друг в друга.

Иногда вложенный оператор if-else настолько распространен и используется так часто, что был разработан более простой оператор, называемый оператором switch.

Также возможно иметь вложенный набор операторов switch.

Groovy — Методы

Метод в Groovy определяется с типом возвращаемого значения или с ключевым словом def . Методы могут получить любое количество аргументов. Нет необходимости, чтобы типы были явно определены при определении аргументов. Модификаторы, такие как публичные, частные и защищенные могут быть добавлены. По умолчанию, если модификатор видимости не предоставлен, метод общедоступен.

Самый простой тип метода — метод без параметров, как показано ниже —

def methodName() { 
   //Method code 
}

Ниже приведен пример простого метода

class Example {
   static def DisplayName() {
      println("This is how methods work in groovy");
      println("This is an example of a simple method");
   } 
	
   static void main(String[] args) {
      DisplayName();
   } 
}

В приведенном выше примере DisplayName — это простой метод, который состоит из двух операторов println, которые используются для вывода некоторого текста на консоль. В нашем статическом методе main мы просто вызываем метод DisplayName. Результатом вышеупомянутого метода будет —

This is how methods work in groovy 
This is an example of a simple method

Параметры метода

Метод более полезен, если его поведение определяется значением одного или нескольких параметров. Мы можем передать значения в вызываемый метод, используя параметры метода. Обратите внимание, что имена параметров должны отличаться друг от друга.

Самый простой тип метода с параметрами, как показано ниже —

def methodName(parameter1, parameter2, parameter3) { 
   // Method code goes here 
}

Ниже приведен пример простого метода с параметрами

class Example {
   static void sum(int a,int b) {
      int c = a+b;
      println(c);
   }  
	
   static void main(String[] args) {
      sum(10,5);
   } 
}

В этом примере мы создаем метод sum с двумя параметрами, a и b . Оба параметра имеют тип int . Затем мы вызываем метод sum из нашего основного метода и передаем значения переменным a и b .

Результатом вышеприведенного метода будет значение 15.

Параметры по умолчанию

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

Ниже приведен пример простого метода с параметрами —

def someMethod(parameter1, parameter2 = 0, parameter3 = 0) { 
   // Method code goes here 
} 

Давайте посмотрим на тот же пример, который мы рассматривали ранее для добавления двух чисел, и создадим метод, который имеет один параметр по умолчанию и другой параметр не по умолчанию —

class Example { 
   static void sum(int a,int b = 5) { 
      int c = a+b; 
      println(c); 
   } 
	
   static void main(String[] args) {
      sum(6); 
   } 
}

В этом примере мы создаем метод суммы с двумя параметрами, a и b . Оба параметра имеют тип int. Разница между этим и предыдущим примерами заключается в том, что в этом случае мы задаем значение по умолчанию для b как 5. Поэтому, когда мы вызываем метод sum из нашего основного метода, у нас есть возможность просто передать одно значение, равное 6, и это будет назначено параметру a в методе sum .

Результатом вышеприведенного метода будет значение 11.

class Example {
   static void sum(int a,int b = 5) {
      int c = a+b;
      println(c);
   } 
	
   static void main(String[] args) {
      sum(6,6);
   } 
}

Мы также можем вызвать метод sum, передав 2 значения, в нашем примере выше мы передаем 2 значения 6. Второе значение 6 фактически заменит значение по умолчанию, назначенное параметру b .

Результатом вышеприведенного метода будет значение 12.

Возвращаемые значения метода

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

Ниже приведен пример простого метода с возвращаемым значением.

class Example {
   static int sum(int a,int b = 5) {
      int c = a+b;
      return c;
   } 
	
   static void main(String[] args) {
      println(sum(6));
   } 
}

В нашем примере выше обратите внимание, что на этот раз мы указываем тип возврата для нашего метода sum, который имеет тип int. В методе мы используем оператор return для отправки значения суммы в вызывающую основную программу. Поскольку значение метода теперь доступно для основного метода, мы используем функцию println для отображения значения в консоли.

Результатом вышеприведенного метода будет значение 11.

Методы экземпляра

Методы обычно реализуются внутри классов в Groovy, как и язык Java. Класс — это не что иное, как план или шаблон для создания различных объектов, который определяет его свойства и поведение. Объекты класса демонстрируют свойства и поведение, определенные его классом. Таким образом, поведение определяется созданием методов внутри класса.

Мы увидим классы более подробно в следующей главе, но ниже приведен пример реализации метода в классе. В наших предыдущих примерах мы определили наш метод как статические методы, что означало, что мы могли получить доступ к этим методам непосредственно из класса. Следующим примером методов являются методы экземпляров, в которых доступ к методам осуществляется путем создания объектов класса. Снова мы увидим классы в следующей главе, а пока покажем, как использовать методы.

Ниже приведен пример того, как методы могут быть реализованы.

class Example { 
   int x; 
	
   public int getX() { 
      return x; 
   } 
	
   public void setX(int pX) { 
      x = pX; 
   } 
	
   static void main(String[] args) { 
      Example ex = new Example(); 
      ex.setX(100); 
      println(ex.getX()); 
   } 
}

В нашем примере выше обратите внимание, что на этот раз мы не указываем статический атрибут для наших методов класса. В нашей основной функции мы фактически создаем экземпляр класса Example и затем вызываем метод объекта ex.

Результатом вышеупомянутого метода будет значение 100.

Локальные и внешние имена параметров

Groovy, как и Java, предоставляет возможность иметь локальные и глобальные параметры. В следующем примере lx является локальным параметром, который имеет область видимости только внутри функции getX (), а x является глобальным свойством, к которому можно получить доступ внутри всего класса Example. Если мы попытаемся получить доступ к переменной lx вне функции getX () , мы получим ошибку.

Live Demo

class Example { 
   static int x = 100; 
	
   public static int getX() { 
      int lx = 200; 
      println(lx); 
      return x; 
   } 
	
   static void main(String[] args) { 
      println(getX()); 
   }  
}

Когда мы запустим вышеуказанную программу, мы получим следующий результат.

200 
100

этот метод для свойств

Как и в Java, groovy может получить доступ к своим членам экземпляра, используя ключевое слово this . В следующем примере показано, как, когда мы используем оператор this.x , он ссылается на его экземпляр и соответственно устанавливает значение x .

class Example { 
   int x = 100; 
	
   public int getX() { 
      this.x = 200; 
      return x; 
   } 
	
   static void main(String[] args) {
      Example ex = new Example(); 
      println(ex.getX());
   }
}

Когда мы запустим вышеуказанную программу, мы получим результат 200, напечатанный на консоли.

Groovy — File I / O

Groovy предоставляет несколько вспомогательных методов при работе с вводом / выводом. Groovy предоставляет более простые классы для обеспечения следующих функций для файлов.

  • Чтение файлов
  • Запись в файлы
  • Обход файловых деревьев
  • Чтение и запись объектов данных в файлы

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

  • java.io.File
  • java.io.InputStream
  • java.io.OutputStream
  • java.io.Reader
  • java.io.Writer

Чтение файлов

В следующем примере будут выведены все строки текстового файла в Groovy. Метод eachLine встроен в класс File в Groovy, чтобы обеспечить чтение каждой строки текстового файла.

import java.io.File 
class Example { 
   static void main(String[] args) { 
      new File("E:/Example.txt").eachLine {  
         line -> println "line : $line"; 
      } 
   } 
}

Класс File используется для создания экземпляра нового объекта, который принимает имя файла в качестве параметра. Затем он берет функцию eachLine, помещает ее в переменную с именем line и печатает ее соответствующим образом.

Если файл содержит следующие строки, они будут напечатаны.

line : Example1
line : Example2

Чтение содержимого файла как целой строки

Если вы хотите получить все содержимое файла в виде строки, вы можете использовать свойство text класса файла. В следующем примере показано, как это можно сделать.

class Example { 
   static void main(String[] args) { 
      File file = new File("E:/Example.txt") 
      println file.text 
   } 
}

Если файл содержит следующие строки, они будут напечатаны.

line : Example1 
line : Example2

Запись в файлы

Если вы хотите записывать в файлы, вам нужно использовать класс Writer для вывода текста в файл. В следующем примере показано, как это можно сделать.

import java.io.File 
class Example { 
   static void main(String[] args) { 
      new File('E:/','Example.txt').withWriter('utf-8') { 
         writer -> writer.writeLine 'Hello World' 
      }  
   } 
}

Если вы откроете файл Example.txt, вы увидите слова «Hello World», напечатанные в файле.

Получение размера файла

Если вы хотите получить размер файла, можно использовать свойство length класса файла, чтобы получить размер файла. В следующем примере показано, как это можно сделать.

class Example {
   static void main(String[] args) {
      File file = new File("E:/Example.txt")
      println "The file ${file.absolutePath} has ${file.length()} bytes"
   } 
}

Приведенный выше код будет показывать размер файла в байтах.

Проверка, является ли файл каталогом

Если вы хотите увидеть, является ли путь файлом или каталогом, можно использовать опции isFile и isDirectory класса File. В следующем примере показано, как это можно сделать.

class Example { 
   static void main(String[] args) { 
      def file = new File('E:/') 
      println "File? ${file.isFile()}" 
      println "Directory? ${file.isDirectory()}" 
   } 
}

Приведенный выше код будет показывать следующий вывод —

File? false 
Directory? True

Создание каталога

Если вы хотите создать новый каталог, вы можете использовать функцию mkdir класса File. В следующем примере показано, как это можно сделать.

class Example {
   static void main(String[] args) {
      def file = new File('E:/Directory')
      file.mkdir()
   } 
}

Каталог E: \ Directory будет создан, если он не существует.

Удаление файла

Если вы хотите удалить файл, вы можете использовать функцию удаления класса File. В следующем примере показано, как это можно сделать.

class Example {
   static void main(String[] args) {
      def file = new File('E:/Example.txt')
      file.delete()
   } 
}

Файл будет удален, если он существует.

Копирование файлов

Groovy также предоставляет функциональность для копирования содержимого из одного файла в другой. В следующем примере показано, как это можно сделать.

class Example {
   static void main(String[] args) {
      def src = new File("E:/Example.txt")
      def dst = new File("E:/Example1.txt")
      dst << src.text
   } 
}

Будет создан файл Example1.txt, и все содержимое файла Example.txt будет скопировано в этот файл.

Получение содержимого каталога

Groovy также предоставляет функции для вывода списка дисков и файлов на диске.

В следующем примере показано, как можно отобразить диски на машине с помощью функции listRoots класса File.

class Example { 
   static void main(String[] args) { 
      def rootFiles = new File("test").listRoots() 
      rootFiles.each { 
         file -> println file.absolutePath 
      }
   }
}

В зависимости от дисков, доступных на вашем компьютере, производительность может отличаться. На стандартной машине вывод будет похож на следующий —

C:\ 
D:\

В следующем примере показано, как составить список файлов в определенном каталоге с помощью функции eachFile класса File.

class Example {
   static void main(String[] args) {
      new File("E:/Temp").eachFile() {  
         file->println file.getAbsolutePath()
      }
   } 
}

Вывод будет отображать все файлы в каталоге E: \ Temp

Если вы хотите рекурсивно отображать все файлы в каталоге и его подкаталогах, то вы должны использовать функцию eachFileRecurse класса File. В следующем примере показано, как это можно сделать.

class Example { 
   static void main(String[] args) {
      new File("E:/temp").eachFileRecurse() {
         file -> println file.getAbsolutePath()
      }
   }
} 

Вывод будет отображать все файлы в каталоге E: \ Temp и в его подкаталогах, если они существуют.

Groovy — опционально

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

При написании кода на Groovy разработчикам предоставляется возможность предоставлять тип или нет. Это может предложить некоторую простоту в реализации и, при правильном использовании, может обеспечить надежное и динамичное обслуживание вашего приложения.

В Groovy необязательная типизация выполняется с помощью ключевого слова def. Ниже приведен пример использования метода def

Live Demo

class Example { 
   static void main(String[] args) { 
      // Example of an Integer using def 
      def a = 100; 
      println(a); 
		
      // Example of an float using def 
      def b = 100.10; 
      println(b); 
		
      // Example of an Double using def 
      def c = 100.101; 
      println(c);
		
      // Example of an String using def 
      def d = "HelloWorld"; 
      println(d); 
   } 
} 

Из вышеприведенной программы мы видим, что мы не объявили отдельные переменные как Integer, float, double или string, даже если они содержат значения этих типов.

Когда мы запустим вышеуказанную программу, мы получим следующий результат —

100 
100.10 
100.101
HelloWorld

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

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

Если мы переписываем приведенный выше код с использованием утиной типизации, он будет выглядеть так, как показано ниже. Имена переменных — это имена, которые чаще всего напоминают тип, который они представляют, что делает код более понятным.

class Example { 
   static void main(String[] args) { 
      // Example of an Integer using def 
      def aint = 100; 
      println(aint); 
		
      // Example of an float using def 
      def bfloat = 100.10; 
      println(bfloat); 
		
      // Example of an Double using def 
      def cDouble = 100.101; 
      println(cDouble);
		
      // Example of an String using def 
      def dString = "HelloWorld"; 
      println(dString); 
   } 
}

Groovy — номера

В Groovy числа фактически представлены как объекты, все они являются экземплярами класса Integer. Чтобы объект сделал что-то, нам нужно вызвать один из методов, объявленных в его классе.

Groovy поддерживает целые числа и числа с плавающей точкой.

  • Целое число — это значение, которое не включает дробь.
  • Число с плавающей запятой — это десятичное значение, которое включает десятичную дробь.

Пример чисел в Groovy показан ниже —

Integer x = 5; 
Float y = 1.25; 

Где x имеет тип Integer, а y это число с плавающей точкой.

Причина, по которой числа в groovy определяются как объекты, обычно заключается в том, что существуют требования для выполнения операций над числами. Концепция предоставления класса над примитивными типами известна как классы-обертки.

По умолчанию в Groovy предусмотрены следующие классы-оболочки.

Классы Обертки

Объект класса-обертки содержит или оборачивает соответствующий ему примитивный тип данных. Процесс преобразования примитивных типов данных в объект называется боксом, и компилятор позаботился об этом. Процесс преобразования объекта обратно в соответствующий ему примитивный тип называется распаковкой.

пример

Ниже приведен пример бокса и распаковки —

class Example { 
   static void main(String[] args) {
      Integer x = 5,y = 10,z = 0; 
		
      // The the values of 5,10 and 0 are boxed into Integer types 
      // The values of x and y are unboxed and the addition is performed 
      z = x+y; 
      println(z);
   }
}

Выходные данные вышеуказанной программы будут равны 15. В приведенном выше примере значения 5, 10 и 0 сначала помещаются в целочисленные переменные x, y и z соответственно. И затем, когда выполняется добавление x и y, значения распаковываются из их целочисленных типов.

Численные методы

Поскольку числа в Groovy представлены в виде классов, ниже приведен список доступных методов.

S.No. Методы и описание
1 xxxValue ()

Этот метод принимает Number в качестве параметра и возвращает тип примитива, основанный на вызываемом методе.

2 сравнить с()

Метод CompareTo заключается в использовании сравнения одного числа с другим. Это полезно, если вы хотите сравнить значение чисел.

3 равна ()

Метод определяет, равен ли объект Number, который вызывает метод, объекту, который передается в качестве аргумента.

4 ценность()

Метод valueOf возвращает соответствующий объект Number, содержащий значение переданного аргумента.

5 нанизывать()

Метод используется для получения объекта String, представляющего значение объекта Number.

6 ParseInt ()

Этот метод используется для получения примитивного типа данных определенной строки. parseXxx () является статическим методом и может иметь один или два аргумента.

7 абс ()

Метод дает абсолютное значение аргумента. Аргумент может быть int, float, long, double, short, byte.

8 CEIL ()

Метод ceil дает наименьшее целое число, которое больше или равно аргументу.

9 этаж()

Этаж метода дает наибольшее целое число, которое меньше или равно аргументу.

10 ечать ()

Метод rint возвращает целое число, наиболее близкое по значению к аргументу.

11 круглый()

Метод round возвращает ближайший long или int в соответствии с типом возвращаемого метода.

12 мин ()

Метод дает меньшее из двух аргументов. Аргумент может быть int, float, long, double.

13 Максимум()

Метод дает максимум из двух аргументов. Аргумент может быть int, float, long, double.

14 ехр ()

Метод возвращает основание натуральных логарифмов e в степень аргумента.

15 журнал()

Метод возвращает натуральный логарифм аргумента.

16 POW ()

Метод возвращает значение первого аргумента, возведенное в степень второго аргумента.

17 SQRT ()

Метод возвращает квадратный корень аргумента.

18 грех ()

Метод возвращает синус указанного двойного значения.

19 сов ()

Метод возвращает косинус указанного двойного значения.

20 тангенс ()

Метод возвращает тангенс указанного двойного значения.

21 как в()

Метод возвращает арксинус указанного двойного значения.

22 экоса ()

Метод возвращает арккозин указанного двойного значения.

23 загар()

Метод возвращает арктангенс указанного двойного значения.

24 atan2 ()

Метод преобразует прямоугольные координаты (x, y) в полярные координаты (r, theta) и возвращает theta.

25 toDegrees ()

Метод преобразует значение аргумента в градусы.

26 радиан ()

Метод преобразует значение аргумента в радианы.

27 случайным образом ()

Метод используется для генерации случайного числа от 0,0 до 1,0. Диапазон: 0.0 = <Math.random <1.0. Различные диапазоны могут быть достигнуты с помощью арифметики.

Этот метод принимает Number в качестве параметра и возвращает тип примитива, основанный на вызываемом методе.

Метод CompareTo заключается в использовании сравнения одного числа с другим. Это полезно, если вы хотите сравнить значение чисел.

Метод определяет, равен ли объект Number, который вызывает метод, объекту, который передается в качестве аргумента.

Метод valueOf возвращает соответствующий объект Number, содержащий значение переданного аргумента.

Метод используется для получения объекта String, представляющего значение объекта Number.

Этот метод используется для получения примитивного типа данных определенной строки. parseXxx () является статическим методом и может иметь один или два аргумента.

Метод дает абсолютное значение аргумента. Аргумент может быть int, float, long, double, short, byte.

Метод ceil дает наименьшее целое число, которое больше или равно аргументу.

Этаж метода дает наибольшее целое число, которое меньше или равно аргументу.

Метод rint возвращает целое число, наиболее близкое по значению к аргументу.

Метод round возвращает ближайший long или int в соответствии с типом возвращаемого метода.

Метод дает меньшее из двух аргументов. Аргумент может быть int, float, long, double.

Метод дает максимум из двух аргументов. Аргумент может быть int, float, long, double.

Метод возвращает основание натуральных логарифмов e в степень аргумента.

Метод возвращает натуральный логарифм аргумента.

Метод возвращает значение первого аргумента, возведенное в степень второго аргумента.

Метод возвращает квадратный корень аргумента.

Метод возвращает синус указанного двойного значения.

Метод возвращает косинус указанного двойного значения.

Метод возвращает тангенс указанного двойного значения.

Метод возвращает арксинус указанного двойного значения.

Метод возвращает арккозин указанного двойного значения.

Метод возвращает арктангенс указанного двойного значения.

Метод преобразует прямоугольные координаты (x, y) в полярные координаты (r, theta) и возвращает theta.

Метод преобразует значение аргумента в градусы.

Метод преобразует значение аргумента в радианы.

Метод используется для генерации случайного числа от 0,0 до 1,0. Диапазон: 0.0 = <Math.random <1.0. Различные диапазоны могут быть достигнуты с помощью арифметики.

Groovy — Струны

Строковый литерал создается в Groovy, заключая текст строки в кавычки.

Groovy предлагает множество способов обозначить строковый литерал. Строки в Groovy могут быть заключены в одинарные кавычки (‘), двойные кавычки (“) или тройные кавычки (“ ””). Кроме того, строка Groovy, заключенная в тройные кавычки, может занимать несколько строк.

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

Live Demo

class Example { 
   static void main(String[] args) { 
      String a = 'Hello Single'; 
      String b = "Hello Double"; 
      String c = "'Hello Triple" + "Multiple lines'";
		
      println(a); 
      println(b); 
      println(c); 
   } 
}

Когда мы запустим вышеуказанную программу, мы получим следующий результат —

Hello Single 
Hello Double 
'Hello TripleMultiple lines'

Индексирование строк

Строки в Groovy — это упорядоченные последовательности символов. Отдельный символ в строке может быть доступен по его позиции. Это дается позицией индекса.

Индексы строки начинаются с нуля и заканчиваются на единицу меньше длины строки. Groovy также позволяет отрицательным индексам отсчитывать от конца строки.

Ниже приведен пример использования индексации строк в Groovy:

Live Demo

class Example { 
   static void main(String[] args) { 
      String sample = "Hello world"; 
      println(sample[4]); // Print the 5 character in the string
		
      //Print the 1st character in the string starting from the back 
      println(sample[-1]); 
      println(sample[1..2]);//Prints a string starting from Index 1 to 2 
      println(sample[4..2]);//Prints a string starting from Index 4 back to 2 
      
   } 
}

Когда мы запустим вышеуказанную программу, мы получим следующий результат —

o 
d 
el 
oll 

Основные строковые операции

Сначала давайте изучим основные строковые операции в Groovy. Они приведены ниже.

S.No. Операция и описание строки
1 Конкатенация двух строк

Конкатенация строк может быть выполнена простым оператором «+».

2 Повторение строки

Повторение строк может быть сделано простым оператором ‘*’.

3 Длина строки

Длина строки определяется методом length () строки.

Конкатенация строк может быть выполнена простым оператором «+».

Повторение строк может быть сделано простым оператором ‘*’.

Длина строки определяется методом length () строки.

Строковые Методы

Вот список методов, поддерживаемых классом String.

S.No. Методы и описание
1 центр()

Возвращает новую строку длины numberOfChars, состоящую из получателя, дополненного слева и справа пробелами.

2 compareToIgnoreCase ()

Сравнивает две строки лексикографически, игнорируя различия в регистре.

3 CONCAT ()

Объединяет указанную строку в конец этой строки.

4 eachMatch ()

Обрабатывает каждую группу регулярных выражений (см. Следующий раздел), соответствующую подстроку заданной строки.

5 EndsWith ()

Проверяет, заканчивается ли эта строка указанным суффиксом.

6 equalsIgnoreCase ()

Сравнивает эту строку с другой строкой, игнорируя соображения регистра.

7 getAt ()

Возвращает строковое значение в позиции индекса

8 индекс()

Возвращает индекс в этой строке первого вхождения указанной подстроки.

9 Матчи()

Он выводит, соответствует ли строка указанному регулярному выражению.

10 минус()

Удаляет часть значения строки.

11 следующий()

Этот метод вызывается оператором ++ для класса String. Увеличивает последний символ в данной строке.

12 padLeft ()

Дополните строку пробелами слева.

13 padRight ()

Заполните строку с пробелами, добавленными справа.

14 плюс ()

Добавляет строку

15 предыдущая ()

Этот метод вызывается оператором — для CharSequence.

16 заменить все()

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

17 задний ход()

Создает новую строку, которая является противоположностью этой строки.

18 Трещина()

Разбивает эту строку вокруг совпадений заданного регулярного выражения.

19 подстрока ()

Возвращает новую строку, которая является подстрокой этой строки.

20 toUpperCase ()

Преобразует все символы в этой строке в верхний регистр.

21 toLowerCase ()

Преобразует все символы в этой строке в нижний регистр.

Возвращает новую строку длины numberOfChars, состоящую из получателя, дополненного слева и справа пробелами.

Сравнивает две строки лексикографически, игнорируя различия в регистре.

Объединяет указанную строку в конец этой строки.

Обрабатывает каждую группу регулярных выражений (см. Следующий раздел), соответствующую подстроку заданной строки.

Проверяет, заканчивается ли эта строка указанным суффиксом.

Сравнивает эту строку с другой строкой, игнорируя соображения регистра.

Возвращает строковое значение в позиции индекса

Возвращает индекс в этой строке первого вхождения указанной подстроки.

Он выводит, соответствует ли строка указанному регулярному выражению.

Удаляет часть значения строки.

Этот метод вызывается оператором ++ для класса String. Увеличивает последний символ в данной строке.

Дополните строку пробелами слева.

Заполните строку с пробелами, добавленными справа.

Добавляет строку

Этот метод вызывается оператором — для CharSequence.

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

Создает новую строку, которая является противоположностью этой строки.

Разбивает эту строку вокруг совпадений заданного регулярного выражения.

Возвращает новую строку, которая является подстрокой этой строки.

Преобразует все символы в этой строке в верхний регистр.

Преобразует все символы в этой строке в нижний регистр.

Groovy — Диапазоны

Диапазон — это сокращение для указания последовательности значений. Диапазон обозначается первым и последним значениями в последовательности, а диапазон может быть включающим или исключающим. Инклюзивный диапазон включает в себя все значения от первого до последнего, в то время как эксклюзивный диапазон включает в себя все значения, кроме последнего. Вот несколько примеров литералов Range —

  • 1..10 — пример инклюзивного диапазона
  • 1 .. <10 — пример эксклюзивного ассортимента
  • ‘a’ .. ‘x’ — Диапазоны также могут состоять из символов
  • 10..1 — Диапазоны также могут быть в порядке убывания
  • ‘x’ .. ‘a’ — Диапазоны также могут состоять из символов и быть в порядке убывания.

Ниже приведены различные методы, доступные для диапазонов.

Sr.No. Методы и описание
1 содержит()

Проверяет, содержит ли диапазон конкретное значение

2 получить()

Возвращает элемент в указанной позиции в этом диапазоне.

3 получить от()

Получите нижнее значение этого диапазона.

4 добраться до()

Получить верхнее значение этого диапазона.

5 isReverse ()

Это обратный диапазон, повторяющийся назад

6 размер()

Возвращает количество элементов в этом диапазоне.

7 подсписок ()

Возвращает представление части этого диапазона между указанным fromIndex, включительно, и toIndex, эксклюзивом

Проверяет, содержит ли диапазон конкретное значение

Возвращает элемент в указанной позиции в этом диапазоне.

Получите нижнее значение этого диапазона.

Получить верхнее значение этого диапазона.

Это обратный диапазон, повторяющийся назад

Возвращает количество элементов в этом диапазоне.

Возвращает представление части этого диапазона между указанным fromIndex, включительно, и toIndex, эксклюзивом

Groovy — Списки

Список — это структура, используемая для хранения коллекции элементов данных. В Groovy список содержит последовательность ссылок на объекты. Ссылки на объекты в Списке занимают позицию в последовательности и отличаются целочисленным индексом. Литерал List представлен в виде серии объектов, разделенных запятыми и заключенных в квадратные скобки.

Чтобы обработать данные в списке, мы должны иметь доступ к отдельным элементам. Списки Groovy индексируются с помощью оператора индексации []. Индексы списка начинаются с нуля, что относится к первому элементу.

Ниже приведены некоторые примеры списков.

  • [11, 12, 13, 14] — список целочисленных значений
  • [‘Angular’, ‘Groovy’, ‘Java’] — список строк
  • [1, 2, [3, 4], 5] — вложенный список
  • [Groovy, 21, 2.11] — гетерогенный список ссылок на объекты
  • [] — Пустой список

В этой главе мы обсудим список методов, доступных в Groovy.

Sr.No. Методы и описание
1 добавлять()

Добавить новое значение в конец этого списка.

2 содержит()

Возвращает true, если этот список содержит указанное значение.

3 получить()

Возвращает элемент в указанной позиции в этом списке.

4 пустой()

Возвращает true, если этот список не содержит элементов

5 минус()

Создает новый список, составленный из элементов оригинала без указанных в коллекции.

6 плюс ()

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

7 поп ()

Удаляет последний элемент из этого списка

8 Удалить()

Удаляет элемент в указанной позиции в этом списке.

9 задний ход()

Создайте новый список, обратный элементам исходного списка

10 размер()

Получает количество элементов в этом списке.

11 Сортировать()

Возвращает отсортированную копию исходного списка.

Добавить новое значение в конец этого списка.

Возвращает true, если этот список содержит указанное значение.

Возвращает элемент в указанной позиции в этом списке.

Возвращает true, если этот список не содержит элементов

Создает новый список, составленный из элементов оригинала без указанных в коллекции.

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

Удаляет последний элемент из этого списка

Удаляет элемент в указанной позиции в этом списке.

Создайте новый список, обратный элементам исходного списка

Получает количество элементов в этом списке.

Возвращает отсортированную копию исходного списка.

Groovy — Карты

Карта (также известная как ассоциативный массив, словарь, таблица и хэш) — это неупорядоченная коллекция ссылок на объекты. Элементы в коллекции Map доступны по значению ключа. Ключи, используемые в карте, могут быть любого класса. Когда мы вставляем в коллекцию Map, требуются два значения: ключ и значение.

Ниже приведены некоторые примеры карт —

  • [‘TopicName’: ‘Lists’, ‘TopicName’: ‘Maps’] — набор пар ключей-значений, у которых TopicName является ключом, и их соответствующие значения.

  • [:] — Пустая карта.

[‘TopicName’: ‘Lists’, ‘TopicName’: ‘Maps’] — набор пар ключей-значений, у которых TopicName является ключом, и их соответствующие значения.

[:] — Пустая карта.

В этой главе мы обсудим методы отображения, доступные в Groovy.

Sr.No. Методы и описание
1 ContainsKey ()

Эта карта содержит этот ключ?

2 получить()

Найдите ключ на этой карте и верните соответствующее значение. Если в этой карте нет записи для ключа, верните ноль.

3 Keyset ()

Получить набор ключей на этой карте.

4 положил()

Связывает указанное значение с указанным ключом в этой карте. Если эта Карта ранее содержала отображение для этого ключа, старое значение заменяется указанным значением.

5 размер()

Возвращает количество отображений значения ключа в этой карте.

6 ценности()

Возвращает представление коллекции значений, содержащихся в этой карте.

Эта карта содержит этот ключ?

Найдите ключ на этой карте и верните соответствующее значение. Если в этой карте нет записи для ключа, верните ноль.

Получить набор ключей на этой карте.

Связывает указанное значение с указанным ключом в этой карте. Если эта Карта ранее содержала отображение для этого ключа, старое значение заменяется указанным значением.

Возвращает количество отображений значения ключа в этой карте.

Возвращает представление коллекции значений, содержащихся в этой карте.

Groovy — Даты и время

Класс Date представляет определенный момент времени с точностью до миллисекунды. Класс Date имеет два конструктора, как показано ниже.

Дата()

Синтаксис

public Date()

Параметры — Нет.

Возвращаемое значение

Выделяет объект Date и инициализирует его так, чтобы он представлял время, в которое он был выделен, с точностью до миллисекунды.

пример

Ниже приведен пример использования этого метода —

Live Demo

class Example { 
   static void main(String[] args) { 
      Date date = new Date(); 
      
      // display time and date using toString() 
      System.out.println(date.toString()); 
   } 
} 

Когда мы запустим вышеуказанную программу, мы получим следующий результат. Следующий вывод даст вам текущую дату и время —

Thu Dec 10 21:31:15 GST 2015

Дата (длинный миллисек)

Синтаксис

public Date(long millisec)

параметры

Миллисек — количество миллисекунд, которое указывается со стандартного базового времени.

Возвращаемое значение — выделяет объект Date и инициализирует его для представления указанного количества миллисекунд со стандартного базового времени, известного как «эпоха», а именно 1 января 1970 года, 00:00:00 по Гринвичу.

пример

Ниже приведен пример использования этого метода —

Live Demo

class Example {
   static void main(String[] args) {
      Date date = new Date(100);
      
      // display time and date using toString()
      System.out.println(date.toString());
   } 
}

Когда мы запустим вышеуказанную программу, мы получим следующий результат —

Thu Jan 01 04:00:00 GST 1970

Ниже приведены методы класса Date. Во всех методах класса Date, которые принимают или возвращают значения года, месяца, даты, часов, минут и секунд, используются следующие представления:

  • Год y представлен целым числом y — 1900.

  • Месяц представлен целым числом от 0 до 11; 0 — январь, 1 — февраль и т. Д .; таким образом, 11 декабря.

  • Дата (день месяца) представляется целым числом от 1 до 31 в обычном порядке.

  • Час представлен целым числом от 0 до 23. Таким образом, час с полуночи до 1 часа ночи — это час 0, а час с полудня до 13 часов — это час 12.

  • Минута представляет собой целое число от 0 до 59 в обычном порядке.

  • Секунду представляет целое число от 0 до 61.

Год y представлен целым числом y — 1900.

Месяц представлен целым числом от 0 до 11; 0 — январь, 1 — февраль и т. Д .; таким образом, 11 декабря.

Дата (день месяца) представляется целым числом от 1 до 31 в обычном порядке.

Час представлен целым числом от 0 до 23. Таким образом, час с полуночи до 1 часа ночи — это час 0, а час с полудня до 13 часов — это час 12.

Минута представляет собой целое число от 0 до 59 в обычном порядке.

Секунду представляет целое число от 0 до 61.

Sr.No. Методы и описание
1 после()

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

2 равна ()

Сравнивает две даты на равенство. Результат имеет значение true тогда и только тогда, когда аргумент не равен NULL и является объектом Date, который представляет тот же момент времени с точностью до миллисекунды, что и этот объект.

3 сравнить с()

Сравнивает две даты заказа.

4 нанизывать()

Преобразует этот объект Date в строку

5 до()

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

6 GetTime ()

Возвращает количество миллисекунд с 1 января 1970 года, 00:00:00 по Гринвичу, представленное этим объектом Date.

7 установленное время()

Устанавливает этот объект Date для представления момента времени, который представляет собой время в миллисекундах после 1 января 1970 года 00:00:00 по Гринвичу.

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

Сравнивает две даты на равенство. Результат имеет значение true тогда и только тогда, когда аргумент не равен NULL и является объектом Date, который представляет тот же момент времени с точностью до миллисекунды, что и этот объект.

Сравнивает две даты заказа.

Преобразует этот объект Date в строку

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

Возвращает количество миллисекунд с 1 января 1970 года, 00:00:00 по Гринвичу, представленное этим объектом Date.

Устанавливает этот объект Date для представления момента времени, который представляет собой время в миллисекундах после 1 января 1970 года 00:00:00 по Гринвичу.

Groovy — регулярные выражения

Регулярное выражение — это шаблон, который используется для поиска подстрок в тексте. Groovy поддерживает регулярные выражения с помощью выражения ~ ”regex”. Текст, заключенный в кавычки, представляет собой выражение для сравнения.

Например, мы можем создать объект регулярного выражения, как показано ниже —

def regex = ~'Groovy'

Когда оператор Groovy = ~ отображается как предикат (выражение, возвращающее логическое значение) в операторах if и while (см. Главу 8), операнд String слева сопоставляется с операндом регулярного выражения справа. Следовательно, каждое из следующих значений обеспечивает значение true.

При определении регулярного выражения можно использовать следующие специальные символы:

  • Есть два специальных позиционных символа, которые используются для обозначения начала и конца строки: символ каретки (∧) и знак доллара ($).

  • Регулярные выражения также могут включать квантификаторы. Знак плюс (+) представляет один или несколько раз, примененных к предыдущему элементу выражения. Звездочка (*) используется для обозначения нуля или более вхождений. Знак вопроса (?) Обозначает ноль или один раз.

  • Метасимвол {и} используется для соответствия определенному количеству экземпляров предыдущего символа.

  • В регулярном выражении символ точки (.) Может представлять любой символ. Это описано как символ подстановки.

  • Регулярное выражение может включать в себя классы символов. Набор символов может быть задан в виде простой последовательности символов, заключенных в метасимволы [и], как в [aeiou]. Для диапазонов букв или чисел вы можете использовать разделитель тире, как в [a – z] или [a – mA – M]. Дополнение класса символов обозначается ведущей кареткой в ​​квадратных ракетках, как в [∧a – z], и представляет все символы, отличные от указанных. Некоторые примеры регулярных выражений приведены ниже

Есть два специальных позиционных символа, которые используются для обозначения начала и конца строки: символ каретки (∧) и знак доллара ($).

Регулярные выражения также могут включать квантификаторы. Знак плюс (+) представляет один или несколько раз, примененных к предыдущему элементу выражения. Звездочка (*) используется для обозначения нуля или более вхождений. Знак вопроса (?) Обозначает ноль или один раз.

Метасимвол {и} используется для соответствия определенному количеству экземпляров предыдущего символа.

В регулярном выражении символ точки (.) Может представлять любой символ. Это описано как символ подстановки.

Регулярное выражение может включать в себя классы символов. Набор символов может быть задан в виде простой последовательности символов, заключенных в метасимволы [и], как в [aeiou]. Для диапазонов букв или чисел вы можете использовать разделитель тире, как в [a – z] или [a – mA – M]. Дополнение класса символов обозначается ведущей кареткой в ​​квадратных ракетках, как в [∧a – z], и представляет все символы, отличные от указанных. Некоторые примеры регулярных выражений приведены ниже

'Groovy' =~ 'Groovy' 
'Groovy' =~ 'oo' 
'Groovy' ==~ 'Groovy' 
'Groovy' ==~ 'oo' 
'Groovy' =~ '∧G' 
‘Groovy' =~ 'G$' 
‘Groovy' =~ 'Gro*vy' 'Groovy' =~ 'Gro{2}vy'

Groovy — обработка исключений

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

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

Исключения широко подразделяются на следующие категории —

  • Проверенное исключение — классы, которые расширяют класс Throwable, за исключением RuntimeException и Error, известны как проверенные исключения, например ,IOException, SQLException и т. Д. Проверенные исключения проверяются во время компиляции.

Проверенное исключение — классы, которые расширяют класс Throwable, за исключением RuntimeException и Error, известны как проверенные исключения, например ,IOException, SQLException и т. Д. Проверенные исключения проверяются во время компиляции.

Одним классическим случаем является FileNotFoundException. Предположим, у вас есть следующий код в вашем приложении, который читает из файла на E-диске.

class Example {
   static void main(String[] args) {
      File file = new File("E://file.txt");
      FileReader fr = new FileReader(file);
   } 
}

если файл (file.txt) отсутствует на диске E, возникает следующее исключение.

Caught: java.io.FileNotFoundException: E: \ file.txt (система не может найти указанный файл).

java.io.FileNotFoundException: E: \ file.txt (система не может найти указанный файл).

  • Непроверенное исключение — классы, которые расширяют RuntimeException, называются непроверенными исключениями, например, ArithmeticException, NullPointerException, ArrayIndexOutOfBoundsException и т. Д. Непроверенные исключения не проверяются во время компиляции, а проверяются во время выполнения.

Непроверенное исключение — классы, которые расширяют RuntimeException, называются непроверенными исключениями, например, ArithmeticException, NullPointerException, ArrayIndexOutOfBoundsException и т. Д. Непроверенные исключения не проверяются во время компиляции, а проверяются во время выполнения.

Одним классическим случаем является исключение ArrayIndexOutOfBoundsException, которое возникает, когда вы пытаетесь получить доступ к индексу массива, который больше длины массива. Ниже приведен типичный пример ошибки такого рода.

class Example {
   static void main(String[] args) {
      def arr = new int[3];
      arr[5] = 5;
   } 
}

Когда приведенный выше код будет выполнен, будет сгенерировано следующее исключение.

Пойман: java.lang.ArrayIndexOutOfBoundsException: 5

java.lang.ArrayIndexOutOfBoundsException: 5

  • Ошибка — ошибка необратима, например, OutOfMemoryError, VirtualMachineError, AssertionError и т. Д.

Ошибка — ошибка необратима, например, OutOfMemoryError, VirtualMachineError, AssertionError и т. Д.

Это ошибки, которые программа никогда не сможет исправить, и это приведет к ее аварийному завершению.

Следующая диаграмма показывает, как организована иерархия исключений в Groovy. Все это основано на иерархии, определенной в Java.

Иерархия Исключений

Ловить исключения

Метод перехватывает исключение, используя комбинацию ключевых слов try и catch . Вокруг кода помещается блок try / catch, который может генерировать исключение.

try { 
   //Protected code 
} catch(ExceptionName e1) {
   //Catch block 
}

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

В блоке catch вы можете написать собственный код для обработки вашего исключения, чтобы приложение могло восстановиться после исключения.

Давайте рассмотрим пример аналогичного кода, который мы видели выше для доступа к массиву со значением индекса, превышающим размер массива. Но на этот раз давайте обернем наш код в блок try / catch.

Live Demo

class Example {
   static void main(String[] args) {
      try {
         def arr = new int[3];
         arr[5] = 5;
      } catch(Exception ex) {
         println("Catching the exception");
      }
		
      println("Let's move on after the exception");
   }
}

Когда мы запустим вышеуказанную программу, мы получим следующий результат —

Catching the exception 
Let's move on after the exception

Из приведенного выше кода мы оборачиваем неисправный код в блоке try. В блоке catch мы просто перехватываем наше исключение и выводим сообщение о том, что произошло исключение.

Многократные Пойманные Блоки

Можно иметь несколько блоков catch для обработки нескольких типов исключений. Для каждого блока catch, в зависимости от типа возникшего исключения, вы должны написать код для соответствующей обработки.

Давайте изменим приведенный выше код, чтобы он специально перехватывал исключение ArrayIndexOutOfBoundsException. Ниже приведен фрагмент кода.

Live Demo

class Example {
   static void main(String[] args) {
      try {
         def arr = new int[3];
         arr[5] = 5;
      }catch(ArrayIndexOutOfBoundsException ex) {
         println("Catching the Array out of Bounds exception");
      }catch(Exception ex) {
         println("Catching the exception");
      }
		
      println("Let's move on after the exception");
   } 
}

Когда мы запустим вышеуказанную программу, мы получим следующий результат —

Catching the Aray out of Bounds exception 
Let's move on after the exception

Из приведенного выше кода вы можете видеть, что блок перехвата ArrayIndexOutOfBoundsException перехватывается первым, потому что это означает критерии исключения.

Наконец-то блок

Блок finally следует за блоком try или блоком catch. Блок кода finally всегда выполняется независимо от возникновения исключения.

Использование блока finally позволяет запускать любые операторы типа очистки, которые вы хотите выполнить, независимо от того, что происходит в защищенном коде. Синтаксис этого блока приведен ниже.

try { 
   //Protected code 
} catch(ExceptionType1 e1) { 
   //Catch block 
} catch(ExceptionType2 e2) { 
   //Catch block 
} catch(ExceptionType3 e3) { 
   //Catch block 
} finally {
   //The finally block always executes. 
}

Давайте изменим наш код выше и добавим блок finally. Ниже приведен фрагмент кода.

class Example {
   static void main(String[] args) {
      try {
         def arr = new int[3];
         arr[5] = 5;
      } catch(ArrayIndexOutOfBoundsException ex) {
         println("Catching the Array out of Bounds exception");
      }catch(Exception ex) {
         println("Catching the exception");
      } finally {
         println("The final block");
      }
		
      println("Let's move on after the exception");
   } 
} 

Когда мы запустим вышеуказанную программу, мы получим следующий результат —

Catching the Array out of Bounds exception 
The final block 
Let's move on after the exception

Ниже приведены методы исключения, доступные в Groovy.

public String getMessage ()

Возвращает подробное сообщение об исключении, которое произошло. Это сообщение инициализируется в конструкторе Throwable.

public Throwable getCause ()

Возвращает причину исключения в виде объекта Throwable.

public String toString ()

Возвращает имя класса, объединенного с результатом getMessage ()

public void printStackTrace ()

Печатает результат toString () вместе с трассировкой стека в System.err, поток вывода ошибок.

public StackTraceElement [] getStackTrace ()

Возвращает массив, содержащий каждый элемент в трассировке стека. Элемент с индексом 0 представляет вершину стека вызовов, а последний элемент в массиве представляет метод в нижней части стека вызовов.

public Throwable fillInStackTrace ()

Заполняет трассировку стека этого объекта Throwable текущей трассировкой стека, добавляя к любой предыдущей информации в трассировке стека.

пример

Ниже приведен пример кода с использованием некоторых методов, приведенных выше:

Live Demo

class Example {
   static void main(String[] args) {
      try {
         def arr = new int[3];
         arr[5] = 5;
      }catch(ArrayIndexOutOfBoundsException ex) {
         println(ex.toString());
         println(ex.getMessage());
         println(ex.getStackTrace());  
      } catch(Exception ex) {
         println("Catching the exception");
      }finally {
         println("The final block");
      }
		
      println("Let's move on after the exception");
   } 
}

Когда мы запустим вышеуказанную программу, мы получим следующий результат —

java.lang.ArrayIndexOutOfBoundsException: 5 
5 
[org.codehaus.groovy.runtime.dgmimpl.arrays.IntegerArrayPutAtMetaMethod$MyPojoMetaMet 
hodSite.call(IntegerArrayPutAtMetaMethod.java:75), 
org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) ,
org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) ,
org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:133) ,
Example.main(Sample:8), sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method),
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57),
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ,
java.lang.reflect.Method.invoke(Method.java:606),
org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93),
groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325),
groovy.lang.MetaClassImpl.invokeStaticMethod(MetaClassImpl.java:1443),
org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:893),
groovy.lang.GroovyShell.runScriptOrMainOrTestOrRunnable(GroovyShell.java:287),
groovy.lang.GroovyShell.run(GroovyShell.java:524),
groovy.lang.GroovyShell.run(GroovyShell.java:513),
groovy.ui.GroovyMain.processOnce(GroovyMain.java:652),
groovy.ui.GroovyMain.run(GroovyMain.java:384),
groovy.ui.GroovyMain.process(GroovyMain.java:370),
groovy.ui.GroovyMain.processArgs(GroovyMain.java:129),
groovy.ui.GroovyMain.main(GroovyMain.java:109),
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method),
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57),
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ,
java.lang.reflect.Method.invoke(Method.java:606),
org.codehaus.groovy.tools.GroovyStarter.rootLoader(GroovyStarter.java:109),
org.codehaus.groovy.tools.GroovyStarter.main(GroovyStarter.java:131),
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method),
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57),
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ,
java.lang.reflect.Method.invoke(Method.java:606),
com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)]
 
The final block 
Let's move on after the exception 

Groovy — Объектно-ориентированный

В Groovy, как и в любом другом объектно-ориентированном языке, существует концепция классов и объектов для представления объектно-ориентированной природы языка программирования. Класс Groovy — это набор данных и методов, которые работают с этими данными. Вместе данные и методы класса используются для представления некоторого объекта реального мира из проблемной области.

Класс в Groovy объявляет состояние (данные) и поведение объектов, определенных этим классом. Следовательно, класс Groovy описывает как поля экземпляра, так и методы для этого класса.

Ниже приведен пример класса в Groovy. Имя класса: Student, у которого есть два поля — StudentID и StudentName . В основной функции мы создаем объект этого класса и присваиваем значения для StudentID и StudentName объекта.

class Student {
   int StudentID;
   String StudentName;
	
   static void main(String[] args) {
      Student st = new Student();
      st.StudentID = 1;
      st.StudentName = "Joe"     
   } 
}

Методы получения и установки

На любом языке программирования всегда практикуется скрытие членов экземпляра с помощью ключевого слова private и предоставление методов получения и установки для установки и получения значений переменных экземпляра соответственно. В следующем примере показано, как это можно сделать.

Live Demo

class Student {
   private int StudentID;
   private String StudentName;
	
   void setStudentID(int pID) {
      StudentID = pID;
   }
	
   void setStudentName(String pName) {
      StudentName = pName;
   }
	
   int getStudentID() {
      return this.StudentID;
   }
	
   String getStudentName() {
      return this.StudentName;
   }
	
   static void main(String[] args) {
      Student st = new Student();
      st.setStudentID(1);
      st.setStudentName("Joe");
		
      println(st.getStudentID());
      println(st.getStudentName());
   } 
}

Когда мы запустим вышеуказанную программу, мы получим следующий результат —

1 
Joe 

Обратите внимание на следующие ключевые моменты о вышеуказанной программе —

  • В классе studentID и studentName помечаются как закрытые, что означает, что к ним нельзя получить доступ извне класса.

  • Каждый элемент экземпляра имеет свой собственный метод получения и установки. Метод getter возвращает значение переменной экземпляра, например, метод int getStudentID (), а метод setter устанавливает значение идентификатора экземпляра, например, метод void setStudentName (String pName)

В классе studentID и studentName помечаются как закрытые, что означает, что к ним нельзя получить доступ извне класса.

Каждый элемент экземпляра имеет свой собственный метод получения и установки. Метод getter возвращает значение переменной экземпляра, например, метод int getStudentID (), а метод setter устанавливает значение идентификатора экземпляра, например, метод void setStudentName (String pName)

Методы экземпляра

Обычно естественно включать в класс больше методов, которые фактически выполняют какую-то функциональность для класса. В нашем примере со студентом давайте добавим членов экземпляров Marks1, Marks2 и Marks3, чтобы обозначить оценки ученика по 3 предметам. Затем мы добавим новый метод экземпляра, который будет вычислять итоговые оценки ученика. Вот как будет выглядеть код.

В следующем примере метод Total является дополнительным методом Instance, в который встроена некоторая логика.

class Student {
   int StudentID;
   String StudentName;
	
   int Marks1;
   int Marks2;
   int Marks3;
	
   int Total() {
      return Marks1+Marks2+Marks3;
   }
	
   static void main(String[] args) {
      Student st = new Student();
      st.StudentID = 1;
      st.StudentName="Joe";
		
      st.Marks1 = 10;
      st.Marks2 = 20;
      st.Marks3 = 30;
		
      println(st.Total());
   }
}

Когда мы запустим вышеуказанную программу, мы получим следующий результат —

60

Создание нескольких объектов

Можно также создать несколько объектов класса. Ниже приведен пример того, как этого можно достичь. Здесь мы создаем 3 объекта (st, st1 и st2) и вызываем их члены экземпляра и методы экземпляра соответственно.

Live Demo

class Student {
   int StudentID;
   String StudentName;
	
   int Marks1;
   int Marks2;
   int Marks3;
	
   int Total() { 
      return Marks1+Marks2+Marks3;
   } 
	
   static void main(String[] args) {
      Student st = new Student();
      st.StudentID = 1;
      st.StudentName = "Joe";
		
      st.Marks1 = 10;
      st.Marks2 = 20;
      st.Marks3 = 30;
		
      println(st.Total()); 
   
      Student st1 = new Student();
      st.StudentID = 1;
      st.StudentName = "Joe";
		
      st.Marks1 = 10;
      st.Marks2 = 20;
      st.Marks3 = 40;
		
      println(st.Total());  
        
      Student st3 = new Student();
      st.StudentID = 1;
      st.StudentName = "Joe";
		
      st.Marks1 = 10; 
      st.Marks2 = 20;
      st.Marks3 = 50;
		
      println(st.Total());
   } 
} 

Когда мы запустим вышеуказанную программу, мы получим следующий результат —

60 
70 
80 

наследование

Наследование может быть определено как процесс, в котором один класс приобретает свойства (методы и поля) другого. С использованием наследования информация становится управляемой в иерархическом порядке.

Класс, который наследует свойства other, известен как подкласс (производный класс, дочерний класс), а класс, свойства которого наследуются, называется суперклассом (базовый класс, родительский класс).

Расширяет

extends — это ключевое слово, используемое для наследования свойств класса. Ниже приведен синтаксис ключевого слова extends. В следующем примере мы делаем следующие вещи —

  • Создание класса с именем Person. Этот класс имеет одного члена экземпляра с именем name.

  • Создание класса с именем Student, который выходит из класса Person. Обратите внимание, что член экземпляра имени, определенный в классе Person, наследуется в классе Student.

  • В конструкторе класса Student мы вызываем конструктор базового класса.

  • В нашем классе Student мы добавляем 2 дополнительных члена-экземпляра StudentID и Marks1.

Создание класса с именем Person. Этот класс имеет одного члена экземпляра с именем name.

Создание класса с именем Student, который выходит из класса Person. Обратите внимание, что член экземпляра имени, определенный в классе Person, наследуется в классе Student.

В конструкторе класса Student мы вызываем конструктор базового класса.

В нашем классе Student мы добавляем 2 дополнительных члена-экземпляра StudentID и Marks1.

Live Demo

class Example {
   static void main(String[] args) {
      Student st = new Student();
      st.StudentID = 1;
		
      st.Marks1 = 10;
      st.name = "Joe";
		
      println(st.name);
   }
} 

class Person {
   public String name;
   public Person() {}  
} 

class Student extends Person {
   int StudentID
   int Marks1;
	
   public Student() {
      super();
   } 
}   

Когда мы запустим вышеуказанную программу, мы получим следующий результат —

Joe

Внутренние классы

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

Ниже приведен пример внешнего и внутреннего класса. В следующем примере мы делаем следующие вещи —

  • Создание класса с именем Outer, который будет нашим внешним классом.
  • Определение строки с именем name в нашем внешнем классе.
  • Создание внутреннего или вложенного класса внутри нашего внешнего класса.
  • Обратите внимание, что во внутреннем классе мы можем получить доступ к элементу экземпляра имени, определенному в классе Outer.

Live Demo

class Example { 
   static void main(String[] args) { 
      Outer outobj = new Outer(); 
      outobj.name = "Joe"; 
      outobj.callInnerMethod() 
   } 
} 

class Outer { 
   String name;
	
   def callInnerMethod() { 
      new Inner().methodA() 
   } 
	
   class Inner {
      def methodA() { 
         println(name); 
      } 
   } 
	
}   

Когда мы запустим вышеуказанную программу, мы получим следующий результат —

Joe

Абстрактные классы

Абстрактные классы представляют собой общие понятия, поэтому их нельзя создавать, создавая для подкласса. Их члены включают поля / свойства и абстрактные или конкретные методы. Абстрактные методы не имеют реализации и должны быть реализованы конкретными подклассами. Абстрактные классы должны быть объявлены с ключевым словом abstract. Абстрактные методы также должны быть объявлены с ключевым словом abstract.

В следующем примере обратите внимание, что класс Person теперь превращен в абстрактный класс и не может быть создан. Также обратите внимание, что в абстрактном классе есть абстрактный метод DisplayMarks, в котором нет деталей реализации. В студенческом классе обязательно добавить детали реализации.

Live Demo

class Example { 
   static void main(String[] args) { 
      Student st = new Student(); 
      st.StudentID = 1;
		
      st.Marks1 = 10; 
      st.name="Joe"; 
		
      println(st.name); 
      println(st.DisplayMarks()); 
   } 
} 

abstract class Person { 
   public String name; 
   public Person() { } 
   abstract void DisplayMarks();
}
 
class Student extends Person { 
   int StudentID 
   int Marks1; 
	
   public Student() { 
      super(); 
   } 
	
   void DisplayMarks() { 
      println(Marks1); 
   }  
} 

Когда мы запустим вышеуказанную программу, мы получим следующий результат —

Joe 
10 
null

Интерфейсы

Интерфейс определяет контракт, которому должен соответствовать класс. Интерфейс только определяет список методов, которые должны быть реализованы, но не определяет реализацию методов. Интерфейс должен быть объявлен с использованием ключевого слова interface. Интерфейс определяет только сигнатуры методов. Методы интерфейса всегда общедоступны . Ошибочно использовать защищенные или приватные методы в интерфейсах.

Ниже приведен пример интерфейса в Groovy. В следующем примере мы делаем следующие вещи —

  • Создание интерфейса с именем Marks и создание метода интерфейса с именем DisplayMarks.

  • В определении класса мы используем ключевое слово Implements для реализации интерфейса.

  • Поскольку мы реализуем интерфейс, мы должны предоставить реализацию для метода DisplayMarks.

Создание интерфейса с именем Marks и создание метода интерфейса с именем DisplayMarks.

В определении класса мы используем ключевое слово Implements для реализации интерфейса.

Поскольку мы реализуем интерфейс, мы должны предоставить реализацию для метода DisplayMarks.

Live Demo

class Example {
   static void main(String[] args) {
      Student st = new Student();
      st.StudentID = 1;
      st.Marks1 = 10;
      println(st.DisplayMarks());
   } 
} 

interface Marks { 
   void DisplayMarks(); 
} 

class Student implements Marks {
   int StudentID
   int Marks1;
	
   void DisplayMarks() {
      println(Marks1);
   }
}

Когда мы запустим вышеуказанную программу, мы получим следующий результат —

10
null

Groovy — Дженерики

Обобщения позволяют типам (классам и интерфейсам) быть параметрами при определении классов, интерфейсов и методов. Подобно более знакомым формальным параметрам, используемым в объявлениях методов, параметры типа предоставляют вам возможность повторно использовать один и тот же код с разными входами. Разница в том, что входные данные для формальных параметров являются значениями, а входные данные для параметров типа являются типами.

Универсальный для коллекций

Классы коллекций, такие как класс List, могут быть обобщены так, что в приложении принимаются только коллекции этого типа. Пример обобщенного ArrayList показан ниже. Следующее утверждение делает то, что оно принимает только те элементы списка, которые имеют строку типа —

List<String> list = new ArrayList<String>();

В следующем примере кода мы делаем следующее:

  • Создание коллекции Generalized ArrayList, которая будет содержать только строки.
  • Добавьте 3 строки в список.
  • Для каждого элемента в списке выведите значение строки.

Live Demo

class Example {
   static void main(String[] args) {
      // Creating a generic List collection
      List<String> list = new ArrayList<String>();
      list.add("First String");
      list.add("Second String");
      list.add("Third String");
		
      for(String str : list) {
         println(str);
      }
   } 
}

Результатом вышеупомянутой программы будет —

First String 
Second String 
Third String

Обобщенные классы

Весь класс также может быть обобщен. Это делает класс более гибким в принятии любых типов и в соответствии с ними работает. Давайте посмотрим на пример того, как мы можем сделать это.

В следующей программе мы выполняем следующие шаги:

  • Мы создаем класс с именем ListType. Обратите внимание на ключевые слова <T>, расположенные перед определением класса. Это говорит компилятору, что этот класс может принимать любой тип. Поэтому, когда мы объявляем объект этого класса, мы можем указать тип во время объявления, и этот тип будет заменен в заполнителе <T>

  • Универсальный класс имеет простые методы получения и установки для работы с переменной-членом, определенной в классе.

  • Обратите внимание, что в основной программе мы можем объявлять объекты класса ListType, но разных типов. Первый тип Integer, а второй тип String.

Мы создаем класс с именем ListType. Обратите внимание на ключевые слова <T>, расположенные перед определением класса. Это говорит компилятору, что этот класс может принимать любой тип. Поэтому, когда мы объявляем объект этого класса, мы можем указать тип во время объявления, и этот тип будет заменен в заполнителе <T>

Универсальный класс имеет простые методы получения и установки для работы с переменной-членом, определенной в классе.

Обратите внимание, что в основной программе мы можем объявлять объекты класса ListType, но разных типов. Первый тип Integer, а второй тип String.

Live Demo

class Example {
   static void main(String[] args) {
      // Creating a generic List collection 
      ListType<String> lststr = new ListType<>();
      lststr.set("First String");
      println(lststr.get()); 
		
      ListType<Integer> lstint = new ListType<>();
      lstint.set(1);
      println(lstint.get());
   }
} 

public class ListType<T> {
   private T localt;
	
   public T get() {
      return this.localt;
   }
	
   public void set(T plocal) {
      this.localt = plocal;
   } 
}

Результатом вышеупомянутой программы будет —

First String 
1

Groovy — Черты

Черты являются структурной конструкцией языка, которая позволяет —

  • Композиция поведения.
  • Реализация интерфейсов во время выполнения.
  • Совместимость со статической проверкой типов / компиляцией

Их можно рассматривать как интерфейсы, несущие как реализации по умолчанию, так и состояние. Черта определяется с помощью ключевого слова trait.

Пример черты приведен ниже —

trait Marks {
   void DisplayMarks() {
      println("Display Marks");
   } 
}

Затем можно использовать ключевое слово Implement для реализации черты аналогично интерфейсам.

class Example {
   static void main(String[] args) {
      Student st = new Student();
      st.StudentID = 1;
      st.Marks1 = 10; 
      println(st.DisplayMarks());
   } 
} 

trait Marks { 
   void DisplayMarks() {
      println("Display Marks");
   } 
} 

class Student implements Marks { 
   int StudentID
   int Marks1;
}

Реализация интерфейсов

Черты могут реализовывать интерфейсы, в этом случае интерфейсы объявляются с использованием ключевого слова Implements.

Пример особенности реализации интерфейса приведен ниже. В следующем примере можно отметить следующие ключевые моменты.

  • Интерфейс Total определяется методом DisplayTotal.

  • Признаки черты реализуют интерфейс Total и, следовательно, должны обеспечить реализацию для метода DisplayTotal.

Интерфейс Total определяется методом DisplayTotal.

Признаки черты реализуют интерфейс Total и, следовательно, должны обеспечить реализацию для метода DisplayTotal.

Live Demo

class Example {
   static void main(String[] args) {
      Student st = new Student();
      st.StudentID = 1;
      st.Marks1 = 10;
		
      println(st.DisplayMarks());
      println(st.DisplayTotal());
   } 
} 

interface Total {
   void DisplayTotal() 
} 

trait Marks implements Total {
   void DisplayMarks() {
      println("Display Marks");
   }
	
   void DisplayTotal() {
      println("Display Total"); 
   } 
} 

class Student implements Marks { 
   int StudentID
   int Marks1;  
} 

Результатом вышеупомянутой программы будет —

Display Marks 
Display Total

свойства

Черта может определять свойства. Пример черты со свойством приведен ниже.

В следующем примере Marks1 типа integer является свойством.

class Example {
   static void main(String[] args) {
      Student st = new Student();
      st.StudentID = 1;
		
      println(st.DisplayMarks());
      println(st.DisplayTotal());
   } 
	
   interface Total {
      void DisplayTotal() 
   } 
	
   trait Marks implements Total {
      int Marks1;
		
      void DisplayMarks() {
         this.Marks1 = 10;
         println(this.Marks1);
      }
		
      void DisplayTotal() {
         println("Display Total");
      } 
   } 
	
   class Student implements Marks {
      int StudentID 
   }
} 

Результатом вышеупомянутой программы будет —

10 
Display Total

Состав поведения

Черты могут быть использованы для реализации множественного наследования контролируемым образом, избегая проблемы алмазов. В следующем примере кода мы определили две черты — Marks и Total . Наш Студенческий класс реализует обе черты. Так как ученический класс расширяет обе черты, он может получить доступ к обоим методам — DisplayMarks и DisplayTotal .

Live Demo

class Example {
   static void main(String[] args) {
      Student st = new Student();
      st.StudentID = 1;
		
      println(st.DisplayMarks());
      println(st.DisplayTotal()); 
   } 
} 

trait Marks {
   void DisplayMarks() {
      println("Marks1");
   } 
} 

trait Total {
   void DisplayTotal() { 
      println("Total");
   } 
}  

class Student implements Marks,Total {
   int StudentID 
}   

Результатом вышеупомянутой программы будет —

Total 
Marks1

Расширение черт

Черты могут расширять другую черту, в этом случае вы должны использовать ключевое слово extends . В следующем примере кода мы расширяем черту Total с помощью черты Marks.

Live Demo

class Example {
   static void main(String[] args) {
      Student st = new Student();
      st.StudentID = 1;
      println(st.DisplayMarks());
   } 
} 

trait Marks {
   void DisplayMarks() {
      println("Marks1");
   } 
} 

trait Total extends Marks {
   void DisplayMarks() {
      println("Total");
   } 
}  

class Student implements Total {
   int StudentID 
}

Результатом вышеупомянутой программы будет —

Total

Groovy — Закрытие

Закрытие — это короткий анонимный блок кода. Обычно он занимает несколько строк кода. Метод может даже принять блок кода в качестве параметра. Они анонимны по своей природе.

Ниже приведен пример простого замыкания и как оно выглядит.

Live Demo

class Example {
   static void main(String[] args) {
      def clos = {println "Hello World"};
      clos.call();
   } 
}

В приведенном выше примере строка кода — {println «Hello World»} называется замыканием. Блок кода, на который ссылается этот идентификатор, может быть выполнен с помощью оператора вызова.

Когда мы запустим вышеуказанную программу, мы получим следующий результат —

Hello World

Формальные параметры в замыканиях

Замыкания также могут содержать формальные параметры, чтобы сделать их более полезными, как и методы в Groovy.

Live Demo

class Example {
   static void main(String[] args) {
      def clos = {param->println "Hello ${param}"};
      clos.call("World");
   } 
}

В приведенном выше примере кода обратите внимание на использование $ {param}, который заставляет замыкание принимать параметр. При вызове замыкания с помощью оператора clos.call у нас теперь есть возможность передать параметр в замыкание.

Когда мы запустим вышеуказанную программу, мы получим следующий результат —

Hello World

Следующая иллюстрация повторяет предыдущий пример и дает тот же результат, но показывает, что может использоваться неявный единственный параметр, упоминаемый как он. Здесь «это» является ключевым словом в Groovy.

class Example {
   static void main(String[] args) {
      def clos = {println "Hello ${it}"};
      clos.call("World");
   } 
}

Когда мы запустим вышеуказанную программу, мы получим следующий результат —

Hello World

Замыкания и Переменные

Более формально, замыкания могут ссылаться на переменные во время определения замыкания. Ниже приведен пример того, как этого можно достичь.

Live Demo

class Example {     
   static void main(String[] args) {
      def str1 = "Hello";
      def clos = {param -> println "${str1} ${param}"}
      clos.call("World");
		
      // We are now changing the value of the String str1 which is referenced in the closure
      str1 = "Welcome";
      clos.call("World");
   } 
}

В приведенном выше примере, помимо передачи параметра в замыкание, мы также определяем переменную с именем str1. Закрытие также принимает переменную вместе с параметром.

Когда мы запустим вышеуказанную программу, мы получим следующий результат —

Hello World 
Welcome World

Использование замыканий в методах

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

В следующем примере показано, как замыкание можно отправить методу в качестве параметра.

Live Demo

class Example { 
   def static Display(clo) {
      // This time the $param parameter gets replaced by the string "Inner"         
      clo.call("Inner");
   } 
	
   static void main(String[] args) {
      def str1 = "Hello";
      def clos = { param -> println "${str1} ${param}" }
      clos.call("World");
		
      // We are now changing the value of the String str1 which is referenced in the closure
      str1 = "Welcome";
      clos.call("World");
		
      // Passing our closure to a method
      Example.Display(clos);
   } 
}

В приведенном выше примере

  • Мы определяем статический метод с именем Display, который принимает замыкание в качестве аргумента.

  • Затем мы определяем замыкание в нашем основном методе и передаем его в наш метод Display в качестве параметра.

Мы определяем статический метод с именем Display, который принимает замыкание в качестве аргумента.

Затем мы определяем замыкание в нашем основном методе и передаем его в наш метод Display в качестве параметра.

Когда мы запустим вышеуказанную программу, мы получим следующий результат —

Hello World 
Welcome World 
Welcome Inner

Замыкания в коллекциях и строках

Несколько методов List, Map и String принимают в качестве аргумента замыкание. Давайте рассмотрим пример использования замыканий в этих типах данных.

Использование замыканий со списками

В следующем примере показано, как замыкания можно использовать со списками. В следующем примере мы сначала определяем простой список значений. Тип коллекции списка затем определяет вызываемую функцию. каждый Эта функция принимает замыкание в качестве параметра и применяет замыкание к каждому элементу списка.

Live Demo

class Example {
   static void main(String[] args) {
      def lst = [11, 12, 13, 14];
      lst.each {println it}
   } 
}

Когда мы запустим вышеуказанную программу, мы получим следующий результат —

11 
12 
13 
14

Использование замыканий с картами

В следующем примере показано, как замыкания можно использовать с Картами. В следующем примере мы сначала определяем простую карту элементов значения ключа. Тип коллекции карт затем определяет функцию с именем .each. Эта функция принимает замыкание в качестве параметра и применяет замыкание к каждой паре ключ-значение на карте.

Live Demo

class Example {
   static void main(String[] args) {
      def mp = ["TopicName" : "Maps", "TopicDescription" : "Methods in Maps"]             
      mp.each {println it}
      mp.each {println "${it.key} maps to: ${it.value}"}
   } 
}

Когда мы запустим вышеуказанную программу, мы получим следующий результат —

TopicName = Maps 
TopicDescription = Methods in Maps 
TopicName maps to: Maps 
TopicDescription maps to: Methods in Maps

Часто нам может потребоваться перебрать членов коллекции и применить некоторую логику только в том случае, если элемент удовлетворяет некоторому критерию. Это легко обрабатывается условным оператором в замыкании.

Live Demo

class Example {
   static void main(String[] args) {
      def lst = [1,2,3,4];
      lst.each {println it}
      println("The list will only display those numbers which are divisible by 2")
      lst.each{num -> if(num % 2 == 0) println num}
   } 
}

Вышеприведенный пример показывает условное выражение if (num% 2 == 0), используемое в замыкании, которое используется для проверки, делится ли каждый элемент в списке на 2.

Когда мы запустим вышеуказанную программу, мы получим следующий результат —

1 
2 
3 
4 
The list will only display those numbers which are divisible by 2.
2 
4 

Методы, используемые с замыканиями

Сами замыкания предоставляют некоторые методы.

Sr.No. Методы и описание
1 находить()

Метод find находит первое значение в коллекции, которое соответствует некоторому критерию.

2 найти все()

Он находит все значения в принимающем объекте, соответствующие условию закрытия.

3 любой () и каждый ()

Метод any перебирает каждый элемент коллекции, проверяя, является ли логический предикат действительным хотя бы для одного элемента.

4 собирать ()

Метод collect перебирает коллекцию, преобразуя каждый элемент в новое значение, используя замыкание в качестве преобразователя.

Метод find находит первое значение в коллекции, которое соответствует некоторому критерию.

Он находит все значения в принимающем объекте, соответствующие условию закрытия.

Метод any перебирает каждый элемент коллекции, проверяя, является ли логический предикат действительным хотя бы для одного элемента.

Метод collect перебирает коллекцию, преобразуя каждый элемент в новое значение, используя замыкание в качестве преобразователя.

Groovy — Аннотации

Аннотации представляют собой форму метаданных, в которой они предоставляют данные о программе, которая не является частью самой программы. Аннотации не оказывают прямого влияния на работу кода, который они аннотируют.

Аннотации в основном используются по следующим причинам —

  • Информация для компилятора — аннотации могут использоваться компилятором для обнаружения ошибок или подавления предупреждений.

  • Обработка во время компиляции и во время развертывания. Программные средства могут обрабатывать информацию аннотаций для генерации кода, файлов XML и т. Д.

  • Обработка во время выполнения — некоторые аннотации доступны для изучения во время выполнения.

Информация для компилятора — аннотации могут использоваться компилятором для обнаружения ошибок или подавления предупреждений.

Обработка во время компиляции и во время развертывания. Программные средства могут обрабатывать информацию аннотаций для генерации кода, файлов XML и т. Д.

Обработка во время выполнения — некоторые аннотации доступны для изучения во время выполнения.

В Groovy основная аннотация выглядит следующим образом:

@interface — Символ знака (@) указывает компилятору, что ниже следует аннотация.

Аннотация может определять элементы в форме методов без тел и необязательного значения по умолчанию.

Аннотации могут быть применены к следующим типам —

Тип строки

Пример аннотации для строки приведен ниже —

@interface Simple { 
   String str1() default "HelloWorld"; 
}

Тип enum

enum DayOfWeek { mon, tue, wed, thu, fri, sat, sun } 
@interface Scheduled {
   DayOfWeek dayOfWeek() 
} 

Тип класса

@interface Simple {} 
@Simple 
class User {
   String username
   int age
}
 
def user = new User(username: "Joe",age:1); 
println(user.age); 
println(user.username);

Значения членов аннотации

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

@interface Example {
   int status() 
}

@Example(status = 1)

Параметры аннотации закрытия

Хорошей особенностью аннотаций в Groovy является то, что вы также можете использовать замыкание в качестве значения аннотации. Поэтому аннотации могут использоваться с самыми разными выражениями.

Пример приведен ниже по этому вопросу. Аннотация Onlyif создается на основе значения класса. Затем аннотация применяется к двум методам, которые отправляют разные сообщения в переменную результата на основе значения числовой переменной.

@interface OnlyIf {
   Class value() 
}  

@OnlyIf({ number<=6 }) 
void Version6() {
   result << 'Number greater than 6' 
} 

@OnlyIf({ number>=6 }) 
void Version7() {
   result << 'Number greater than 6' 
}

Мета аннотации

Это довольно полезная функция аннотации в Groovy. Могут возникнуть ситуации, когда у вас может быть несколько аннотаций для метода, как показано ниже. Иногда это может стать беспорядочным, чтобы иметь несколько аннотаций.

@Procedure 
@Master class 
MyMasterProcedure {} 

В таком случае вы можете определить метааннотацию, которая объединяет несколько аннотаций вместе, и применить метааннотацию к методу. Таким образом, для приведенного выше примера вы можете сначала определить коллекцию аннотаций, используя AnnotationCollector.

import groovy.transform.AnnotationCollector
  
@Procedure 
@Master 
@AnnotationCollector

Как только это будет сделано, вы можете применить следующий мета-аннотатор к методу:

import groovy.transform.AnnotationCollector
  
@Procedure 
@Master 
@AnnotationCollector
  
@MasterProcedure 
class MyMasterProcedure {}

Groovy — XML

XML — это переносимый язык с открытым исходным кодом, который позволяет программистам разрабатывать приложения, которые могут быть прочитаны другими приложениями, независимо от операционной системы и / или языка разработки. Это один из самых распространенных языков, используемых для обмена данными между приложениями.

Что такое XML?

Расширяемый язык разметки XML — это язык разметки, очень похожий на HTML или SGML. Это рекомендуется Консорциумом World Wide Web и доступно в качестве открытого стандарта. XML чрезвычайно полезен для отслеживания небольших и средних объемов данных без использования магистрали на основе SQL.

Поддержка XML в Groovy

Язык Groovy также обеспечивает богатую поддержку языка XML. Два самых основных используемых класса XML:

  • XML Markup Builder — Groovy поддерживает генератор разметки на основе дерева, BuilderSupport, который можно разделить на подклассы для создания различных представлений объектов с древовидной структурой. Обычно эти компоновщики используются для представления разметки XML, разметки HTML. Генератор разметки Groovy ловит вызовы псевдометодов и преобразует их в элементы или узлы древовидной структуры. Параметры этих псевдометодов рассматриваются как атрибуты узлов. Замыкания как часть вызова метода рассматриваются как вложенный подконтент для результирующего узла дерева.

  • Анализатор XML. Класс Groovy XmlParser использует простую модель для анализа XML-документа в дереве экземпляров Node. Каждый узел имеет имя элемента XML, атрибуты элемента и ссылки на любые дочерние узлы. Этой модели достаточно для самой простой обработки XML.

XML Markup Builder — Groovy поддерживает генератор разметки на основе дерева, BuilderSupport, который можно разделить на подклассы для создания различных представлений объектов с древовидной структурой. Обычно эти компоновщики используются для представления разметки XML, разметки HTML. Генератор разметки Groovy ловит вызовы псевдометодов и преобразует их в элементы или узлы древовидной структуры. Параметры этих псевдометодов рассматриваются как атрибуты узлов. Замыкания как часть вызова метода рассматриваются как вложенный подконтент для результирующего узла дерева.

Анализатор XML. Класс Groovy XmlParser использует простую модель для анализа XML-документа в дереве экземпляров Node. Каждый узел имеет имя элемента XML, атрибуты элемента и ссылки на любые дочерние узлы. Этой модели достаточно для самой простой обработки XML.

Для всех наших примеров XML-кода давайте используем следующий простой XML-файл movies.xml для создания XML-файла и последующего чтения файла.

<collection shelf = "New Arrivals"> 

   <movie title = "Enemy Behind"> 
      <type>War, Thriller</type> 
      <format>DVD</format> 
      <year>2003</year> 
      <rating>PG</rating> 
      <stars>10</stars> 
      <description>Talk about a US-Japan war</description> 
   </movie> 
	
   <movie title = "Transformers"> 
      <type>Anime, Science Fiction</type>
      <format>DVD</format> 
      <year>1989</year> 
      <rating>R</rating> 
      <stars>8</stars> 
      <description>A schientific fiction</description> 
   </movie> 
	
   <movie title = "Trigun"> 
      <type>Anime, Action</type> 
      <format>DVD</format> 
      <year>1986</year> 
      <rating>PG</rating> 
      <stars>10</stars> 
      <description>Vash the Stam pede!</description> 
   </movie> 
	
   <movie title = "Ishtar"> 
      <type>Comedy</type> 
      <format>VHS</format> 
      <year>1987</year> 
      <rating>PG</rating> 
      <stars>2</stars> 
      <description>Viewable boredom </description> 
   </movie> 
	
</collection> 

XML Markup Builder

Синтаксис

public MarkupBuilder()

MarkupBuilder используется для создания всего документа XML. Документ XML создается вначале путем создания объекта класса документа XML. Как только объект создан, может быть вызван псевдометод для создания различных элементов XML-документа.

Давайте рассмотрим пример того, как создать один блок, то есть один элемент фильма из приведенного выше XML-документа.

Live Demo

import groovy.xml.MarkupBuilder 

class Example {
   static void main(String[] args) {
      def mB = new MarkupBuilder()
		
      // Compose the builder
      mB.collection(shelf : 'New Arrivals') {
         movie(title : 'Enemy Behind')
         type('War, Thriller')
         format('DVD')
         year('2003')
         rating('PG')
         stars(10)
         description('Talk about a US-Japan war') 
      }
   } 
}

В приведенном выше примере необходимо отметить следующее:

  • mB.collection () — это генератор разметки, который создает XML-тег head для <collection> </ collection>

  • movie (title: ‘Enemy Behind’) — Эти псевдометоды создают дочерние теги с помощью этого метода, создавая тег со значением. Указывая значение с названием title, это фактически означает, что для элемента должен быть создан атрибут.

  • Псевдометоду предоставляется замыкание для создания оставшихся элементов документа XML.

  • Конструктор по умолчанию для класса MarkupBuilder инициализируется таким образом, чтобы сгенерированный XML был передан в стандартный поток вывода.

mB.collection () — это генератор разметки, который создает XML-тег head для <collection> </ collection>

movie (title: ‘Enemy Behind’) — Эти псевдометоды создают дочерние теги с помощью этого метода, создавая тег со значением. Указывая значение с названием title, это фактически означает, что для элемента должен быть создан атрибут.

Псевдометоду предоставляется замыкание для создания оставшихся элементов документа XML.

Конструктор по умолчанию для класса MarkupBuilder инициализируется таким образом, чтобы сгенерированный XML был передан в стандартный поток вывода.

Когда мы запустим вышеуказанную программу, мы получим следующий результат —

<collection shelf = 'New Arrivals'> 
   <movie title = 'Enemy Behind' /> 
      <type>War, Thriller</type> 
      <format>DVD</format> 
      <year>2003</year> 
      <rating>PG</rating> 
      <stars>10</stars> 
      <description>Talk about a US-Japan war</description> 
   </movie> 
</collection>

Чтобы создать весь XML-документ, необходимо сделать следующее.

  • Запись карты должна быть создана для хранения различных значений элементов.
  • Для каждого элемента карты мы присваиваем значение каждому элементу.

Live Demo

import groovy.xml.MarkupBuilder 

class Example {
   static void main(String[] args) {
      def mp = [1 : ['Enemy Behind', 'War, Thriller','DVD','2003', 
         'PG', '10','Talk about a US-Japan war'],
         2 : ['Transformers','Anime, Science Fiction','DVD','1989', 
         'R', '8','A scientific fiction'],
         3 : ['Trigun','Anime, Action','DVD','1986', 
         'PG', '10','Vash the Stam pede'],
         4 : ['Ishtar','Comedy','VHS','1987', 'PG', 
         '2','Viewable boredom ']] 
			
      def mB = new MarkupBuilder()  
		
      // Compose the builder
      def MOVIEDB = mB.collection('shelf': 'New Arrivals') {
         mp.each {
            sd -> 
            mB.movie('title': sd.value[0]) {  
               type(sd.value[1])
               format(sd.value[2])
               year(sd.value[3]) 
               rating(sd.value[4])
               stars(sd.value[4]) 
               description(sd.value[5]) 
            }
         }
      }
   } 
} 

Когда мы запустим вышеуказанную программу, мы получим следующий результат —

<collection shelf = 'New Arrivals'> 
   <movie title = 'Enemy Behind'> 
      <type>War, Thriller</type> 
      <format>DVD</format> 
      <year>2003</year> 
      <rating>PG</rating> 
      <stars>PG</stars> 
      <description>10</description> 
   </movie> 
   <movie title = 'Transformers'> 
      <type>Anime, Science Fiction</type> 
      <format>DVD</format> 
      <year>1989</year>
	  <rating>R</rating> 
      <stars>R</stars> 
      <description>8</description> 
   </movie> 
   <movie title = 'Trigun'> 
      <type>Anime, Action</type> 
      <format>DVD</format> 
      <year>1986</year> 
      <rating>PG</rating> 
      <stars>PG</stars> 
      <description>10</description> 
   </movie> 
   <movie title = 'Ishtar'> 
      <type>Comedy</type> 
      <format>VHS</format> 
      <year>1987</year> 
      <rating>PG</rating> 
      <stars>PG</stars> 
      <description>2</description> 
   </movie> 
</collection> 

Синтаксический анализ XML

Класс Groovy XmlParser использует простую модель для анализа XML-документа в дереве экземпляров Node. Каждый узел имеет имя элемента XML, атрибуты элемента и ссылки на любые дочерние узлы. Этой модели достаточно для самой простой обработки XML.

Синтаксис

public XmlParser() 
   throws ParserConfigurationException, 
      SAXException

В следующем коде показан пример использования синтаксического анализатора XML для чтения XML-документа.

Давайте предположим, что у нас есть тот же документ с именем Movies.xml, и мы хотели проанализировать XML-документ и отобразить правильный вывод для пользователя. Следующий код представляет собой фрагмент того, как мы можем просмотреть весь контент XML-документа и отобразить правильный ответ пользователю.

import groovy.xml.MarkupBuilder 
import groovy.util.*

class Example {

   static void main(String[] args) { 
	
      def parser = new XmlParser()
      def doc = parser.parse("D:\\Movies.xml");
		
      doc.movie.each{
         bk->
         print("Movie Name:")
         println "${bk['@title']}"
			
         print("Movie Type:")
         println "${bk.type[0].text()}"
			
         print("Movie Format:")
         println "${bk.format[0].text()}"
			
         print("Movie year:")
         println "${bk.year[0].text()}"
			
         print("Movie rating:")
         println "${bk.rating[0].text()}"
			
         print("Movie stars:")
         println "${bk.stars[0].text()}"
			
         print("Movie description:")
         println "${bk.description[0].text()}"
         println("*******************************")
      }
   }
} 

Когда мы запустим вышеуказанную программу, мы получим следующий результат —

Movie Name:Enemy Behind 
Movie Type:War, Thriller 
Movie Format:DVD 
Movie year:2003 
Movie rating:PG 
Movie stars:10 
Movie description:Talk about a US-Japan war 
******************************* 
Movie Name:Transformers 
Movie Type:Anime, Science Fiction 
Movie Format:DVD 
Movie year:1989 
Movie rating:R 
Movie stars:8 
Movie description:A schientific fiction 
******************************* 
Movie Name:Trigun 
Movie Type:Anime, Action
Movie Format:DVD 
Movie year:1986 
Movie rating:PG 
Movie stars:10 
Movie description:Vash the Stam pede! 
******************************* 
Movie Name:Ishtar 
Movie Type:Comedy 
Movie Format:VHS 
Movie year:1987 
Movie rating:PG 
Movie stars:2 
Movie description:Viewable boredom

Важные вещи, чтобы отметить о приведенном выше коде.

  • Объект класса XmlParser формируется таким образом, чтобы его можно было использовать для анализа XML-документа.

  • Синтаксическому анализатору задается местоположение файла XML.

  • Для каждого элемента фильма мы используем замыкание для просмотра каждого дочернего узла и отображения соответствующей информации.

Объект класса XmlParser формируется таким образом, чтобы его можно было использовать для анализа XML-документа.

Синтаксическому анализатору задается местоположение файла XML.

Для каждого элемента фильма мы используем замыкание для просмотра каждого дочернего узла и отображения соответствующей информации.

Для самого элемента movie мы используем символ @ для отображения атрибута title, прикрепленного к элементу movie.

Groovy — JMX

JMX — это стандарт defacto, который используется для мониторинга всех приложений, имеющих отношение к виртуальной среде Java. Учитывая, что Groovy находится прямо над Java, Groovy может использовать огромный объем работы, уже проделанной для JMX с Java.

Мониторинг JVM

Можно использовать стандартные классы, доступные в java.lang.management, для мониторинга JVM. В следующем примере кода показано, как это можно сделать.

Live Demo

import java.lang.management.*

def os = ManagementFactory.operatingSystemMXBean 
println """OPERATING SYSTEM: 
\tOS architecture = $os.arch 
\tOS name = $os.name 
\tOS version = $os.version 
\tOS processors = $os.availableProcessors 
""" 
 
def rt = ManagementFactory.runtimeMXBean 
println """RUNTIME: 
   \tRuntime name = $rt.name 
   \tRuntime spec name = $rt.specName 
   \tRuntime vendor = $rt.specVendor 
   \tRuntime spec version = $rt.specVersion 
   \tRuntime management spec version = $rt.managementSpecVersion 
   """ 

def mem = ManagementFactory.memoryMXBean 
def heapUsage = mem.heapMemoryUsage 
def nonHeapUsage = mem.nonHeapMemoryUsage 

println """MEMORY: 
   HEAP STORAGE: 
      \tMemory committed = $heapUsage.committed 
      \tMemory init = $heapUsage.init 
      \tMemory max = $heapUsage.max 
      \tMemory used = $heapUsage.used NON-HEAP STORAGE: 
      \tNon-heap memory committed = $nonHeapUsage.committed 
      \tNon-heap memory init = $nonHeapUsage.init 
      \tNon-heap memory max = $nonHeapUsage.max 
      \tNon-heap memory used = $nonHeapUsage.used 
   """
  
println "GARBAGE COLLECTION:" 
ManagementFactory.garbageCollectorMXBeans.each { gc ->
   println "\tname = $gc.name"
   println "\t\tcollection count = $gc.collectionCount"
   println "\t\tcollection time = $gc.collectionTime"
   String[] mpoolNames =   gc.memoryPoolNames
	
   mpoolNames.each { 
      mpoolName -> println "\t\tmpool name = $mpoolName"
   } 
}

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

OPERATING SYSTEM: 
   OS architecture = x86 
   OS name = Windows 7 
   OS version = 6.1 
   OS processors = 4
   
RUNTIME: 
   Runtime name = 5144@Babuli-PC 
   Runtime spec name = Java Virtual Machine Specification 
   Runtime vendor = Oracle Corporation 
   Runtime spec version = 1.7 
   Runtime management spec version = 1.2
   
MEMORY: 
   HEAP STORAGE: 
      Memory committed = 16252928 
      Memory init = 16777216 
      Memory max = 259522560 
      Memory used = 7355840
   
NON-HEAP STORAGE: 
   Non-heap memory committed = 37715968 
   Non-heap memory init = 35815424 
   Non-heap memory max = 123731968 
   Non-heap memory used = 18532232 
   
GARBAGE COLLECTION: 
   name = Copy 
   collection count = 15 
   collection time = 47 
   mpool name = Eden Space 
   mpool name = Survivor Space
		
   name = MarkSweepCompact 
      collection count = 0 
      collection time = 0 
		
      mpool name = Eden Space 
      mpool name = Survivor Space 
      mpool name = Tenured Gen 
      mpool name = Perm Gen 
      mpool name = Perm Gen [shared-ro] 
      mpool name = Perm Gen [shared-rw]

Мониторинг Tomcat

Для мониторинга tomcat при запуске tomcat должен быть установлен следующий параметр:

set JAVA_OPTS = -Dcom.sun.management.jmxremote 
Dcom.sun.management.jmxremote.port = 9004\
 
-Dcom.sun.management.jmxremote.authenticate=false 
Dcom.sun.management.jmxremote.ssl = false

В следующем коде JMX используется для обнаружения доступных MBean-компонентов в запущенном Tomcat, определения веб-модулей и извлечения времени обработки для каждого веб-модуля.

import groovy.swing.SwingBuilder
  
import javax.management.ObjectName 
import javax.management.remote.JMXConnectorFactory as JmxFactory 
import javax.management.remote.JMXServiceURL as JmxUrl 
import javax.swing.WindowConstants as WC 
 
import org.jfree.chart.ChartFactory 
import org.jfree.data.category.DefaultCategoryDataset as Dataset 
import org.jfree.chart.plot.PlotOrientation as Orientation 
 
def serverUrl = 'service:jmx:rmi:///jndi/rmi://localhost:9004/jmxrmi' 
def server = JmxFactory.connect(new JmxUrl(serverUrl)).MBeanServerConnection 
def serverInfo = new GroovyMBean(server, 'Catalina:type = Server').serverInfo 
println "Connected to: $serverInfo" 
 
def query = new ObjectName('Catalina:*') 
String[] allNames = server.queryNames(query, null) 

def modules = allNames.findAll { name -> 
   name.contains('j2eeType=WebModule') 
}.collect{ new GroovyMBean(server, it) }
  
println "Found ${modules.size()} web modules. Processing ..." 
def dataset = new Dataset() 
 
modules.each { m ->
   println m.name()
   dataset.addValue m.processingTime, 0, m.path 
}

Groovy — JSON

В этой главе рассказывается, как использовать язык Groovy для анализа и создания объектов JSON.

Функции JSON

Sr.No Функции и библиотеки
1

JsonSlurper

JsonSlurper — это класс, который анализирует текст JSON или контент читателя в данные Groovy.

Структуры, такие как карты, списки и примитивные типы, такие как Integer, Double, Boolean и String.

2

JsonOutput

Этот метод отвечает за сериализацию объектов Groovy в строки JSON.

JsonSlurper

JsonSlurper — это класс, который анализирует текст JSON или контент читателя в данные Groovy.

Структуры, такие как карты, списки и примитивные типы, такие как Integer, Double, Boolean и String.

JsonOutput

Этот метод отвечает за сериализацию объектов Groovy в строки JSON.

Разбор данных с использованием JsonSlurper

JsonSlurper — это класс, который анализирует текст JSON или контент для чтения в структурах данных Groovy, таких как карты, списки и типы примитивов, такие как Integer, Double, Boolean и String.

Синтаксис

def slurper = new JsonSlurper()

JSON slurper анализирует текст или контент читателя в структуру данных списков и карт.

Класс JsonSlurper поставляется с несколькими вариантами реализации парсера. Иногда у вас могут быть разные требования, когда дело доходит до разбора определенных строк. Давайте рассмотрим случай, когда нужно прочитать JSON, который возвращается из ответа от веб-сервера. В таком случае выгодно использовать вариант парсера JsonParserLax. Этот анализатор допускает комментарии в тексте JSON, а также строки кавычек и т. Д. Чтобы указать этот тип синтаксического анализатора, вам нужно использовать тип синтаксического анализатора JsonParserType.LAX при определении объекта JsonSlurper.

Давайте посмотрим на пример, приведенный ниже. Пример для получения данных JSON с веб-сервера с использованием модуля http. Для этого типа обхода лучший вариант — установить для типа синтаксического анализатора вариант JsonParserLax.

http.request( GET, TEXT ) {
   headers.Accept = 'application/json'
   headers.'User-Agent' = USER_AGENT
	
   response.success = { 
      res, rd ->  
      def jsonText = rd.text 
		
      //Setting the parser type to JsonParserLax
      def parser = new JsonSlurper().setType(JsonParserType.LAX)
      def jsonResp = parser.parseText(jsonText)
   }
}

Аналогично в Groovy доступны следующие дополнительные типы парсеров:

  • Парсер JsonParserCharArray в основном принимает строку JSON и работает с базовым символьным массивом. Во время преобразования значения он копирует символьные подмассивы (механизм, известный как «измельчение») и работает с ними индивидуально.

  • JsonFastParser является специальным вариантом JsonParserCharArray и является самым быстрым анализатором. JsonFastParser также известен как анализатор наложения индекса. Во время синтаксического анализа данной строки JSON он старается изо всех сил избегать создания новых массивов символов или экземпляров String. Он просто сохраняет указатели только на исходный массив символов. Кроме того, он откладывает создание объекта как можно позже.

  • JsonParserUsingCharacterSource — это специальный анализатор для очень больших файлов. Он использует технику, называемую «символьное оконное управление», для анализа больших файлов JSON (в данном случае больших означает файлы размером более 2 МБ) с постоянными характеристиками производительности.

Парсер JsonParserCharArray в основном принимает строку JSON и работает с базовым символьным массивом. Во время преобразования значения он копирует символьные подмассивы (механизм, известный как «измельчение») и работает с ними индивидуально.

JsonFastParser является специальным вариантом JsonParserCharArray и является самым быстрым анализатором. JsonFastParser также известен как анализатор наложения индекса. Во время синтаксического анализа данной строки JSON он старается изо всех сил избегать создания новых массивов символов или экземпляров String. Он просто сохраняет указатели только на исходный массив символов. Кроме того, он откладывает создание объекта как можно позже.

JsonParserUsingCharacterSource — это специальный анализатор для очень больших файлов. Он использует технику, называемую «символьное оконное управление», для анализа больших файлов JSON (в данном случае больших означает файлы размером более 2 МБ) с постоянными характеристиками производительности.

Разбор текста

Давайте посмотрим на некоторые примеры того, как мы можем использовать класс JsonSlurper.

Live Demo

import groovy.json.JsonSlurper 

class Example {
   static void main(String[] args) {
      def jsonSlurper = new JsonSlurper()
      def object = jsonSlurper.parseText('{ "name": "John", "ID" : "1"}') 
		
      println(object.name);
      println(object.ID);
   } 
}

В приведенном выше примере мы —

  • Сначала создаем экземпляр класса JsonSlurper

  • Затем мы используем функцию parseText класса JsonSlurper для анализа некоторого текста JSON.

  • Когда мы получаем объект, вы можете видеть, что мы можем получить доступ к значениям в строке JSON через ключ.

Сначала создаем экземпляр класса JsonSlurper

Затем мы используем функцию parseText класса JsonSlurper для анализа некоторого текста JSON.

Когда мы получаем объект, вы можете видеть, что мы можем получить доступ к значениям в строке JSON через ключ.

Вывод вышеуказанной программы приведен ниже —

John 
1

Разбор списка целых чисел

Давайте посмотрим на другой пример метода синтаксического анализа JsonSlurper. В следующем примере мы вставляем список целых чисел. Из следующего кода вы заметите, что мы можем использовать метод List каждого из них и передать ему закрытие.

Live Demo

import groovy.json.JsonSlurper 
class Example {
   static void main(String[] args) {
      def jsonSlurper = new JsonSlurper()
      Object lst = jsonSlurper.parseText('{ "List": [2, 3, 4, 5] }')
      lst.each { println it }
   } 
}

Вывод вышеуказанной программы приведен ниже —

List=[2, 3, 4, 5]

Разбор списка примитивных типов данных

Анализатор JSON также поддерживает примитивные типы данных: строка, число, объект, истина, ложь и ноль. Класс JsonSlurper преобразует эти типы JSON в соответствующие типы Groovy.

В следующем примере показано, как использовать JsonSlurper для анализа строки JSON. И здесь вы можете видеть, что JsonSlurper способен анализировать отдельные элементы в их соответствующие примитивные типы.

Live Demo

import groovy.json.JsonSlurper 
class Example {

   static void main(String[] args) {
      def jsonSlurper = new JsonSlurper()
      def obj = jsonSlurper.parseText ''' {"Integer": 12, "fraction": 12.55, "double": 12e13}'''
		
      println(obj.Integer);
      println(obj.fraction);
      println(obj.double); 
   } 
}

Вывод вышеуказанной программы приведен ниже —

12 
12.55 
1.2E+14 

JsonOutput

Теперь поговорим о том, как напечатать вывод в Json. Это можно сделать методом JsonOutput. Этот метод отвечает за сериализацию объектов Groovy в строки JSON.

Синтаксис

Static string JsonOutput.toJson(datatype obj)

Параметры — параметры могут быть объектом типа данных — число, логическое значение, символ, строка, дата, карта, замыкание и т. Д.

Тип возвращаемого значения — тип возвращаемого значения — строка json.

пример

Ниже приведен простой пример того, как этого можно достичь.

import groovy.json.JsonOutput 
class Example {
   static void main(String[] args) {
      def output = JsonOutput.toJson([name: 'John', ID: 1])
      println(output);  
   }
}

Вывод вышеуказанной программы приведен ниже —

{"name":"John","ID":1}

JsonOutput также можно использовать для простых старых шпунтованных объектов. В следующем примере вы можете видеть, что мы фактически передаем объекты типа Student в метод JsonOutput.

Live Demo

import groovy.json.JsonOutput  
class Example {
   static void main(String[] args) {
      def output = JsonOutput.toJson([ new Student(name: 'John',ID:1),
         new Student(name: 'Mark',ID:2)])
      println(output);  
   } 
}
 
class Student {
   String name
   int ID; 
}

Вывод вышеуказанной программы приведен ниже —

[{"name":"John","ID":1},{"name":"Mark","ID":2}]

Groovy — DSLS

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

Если вызов выполняется как abcd , это фактически будет эквивалентно a (b) .c (d) .

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

def lst = [1,2,3,4] 
print lst

Приведенный выше код показывает список чисел, выводимых на консоль с помощью оператора println. На доменно-ориентированном языке команды будут выглядеть так:

Given the numbers 1,2,3,4
 
Display all the numbers

Таким образом, приведенный выше пример показывает преобразование языка программирования для удовлетворения потребностей конкретного предметного языка.

Давайте рассмотрим простой пример того, как мы можем реализовать DSL в Groovy:

class EmailDsl {  
   String toText 
   String fromText 
   String body 
	
   /** 
   * This method accepts a closure which is essentially the DSL. Delegate the 
   * closure methods to 
   * the DSL class so the calls can be processed 
   */ 
   
   def static make(closure) { 
      EmailDsl emailDsl = new EmailDsl() 
      // any method called in closure will be delegated to the EmailDsl class 
      closure.delegate = emailDsl
      closure() 
   }
   
   /** 
   * Store the parameter as a variable and use it later to output a memo 
   */ 
	
   def to(String toText) { 
      this.toText = toText 
   }
   
   def from(String fromText) { 
      this.fromText = fromText 
   }
   
   def body(String bodyText) { 
      this.body = bodyText 
   } 
}

EmailDsl.make { 
   to "Nirav Assar" 
   from "Barack Obama" 
   body "How are things? We are doing well. Take care" 
}

Когда мы запустим вышеуказанную программу, мы получим следующий результат —

How are things? We are doing well. Take care

Необходимо отметить следующее о реализации кода выше:

  • Используется статический метод, который принимает замыкание. Это в основном простой способ реализации DSL.

  • В примере электронной почты у класса EmailDsl есть метод make. Он создает экземпляр и делегирует все вызовы в замыкании экземпляру. Это механизм, в котором разделы «to» и «from» в конечном итоге выполняют методы внутри класса EmailDsl.

  • После вызова метода to () мы сохраняем текст в экземпляре для последующего форматирования.

  • Теперь мы можем вызвать метод EmailDSL с простым языком, понятным для конечных пользователей.

Используется статический метод, который принимает замыкание. Это в основном простой способ реализации DSL.

В примере электронной почты у класса EmailDsl есть метод make. Он создает экземпляр и делегирует все вызовы в замыкании экземпляру. Это механизм, в котором разделы «to» и «from» в конечном итоге выполняют методы внутри класса EmailDsl.

После вызова метода to () мы сохраняем текст в экземпляре для последующего форматирования.

Теперь мы можем вызвать метод EmailDSL с простым языком, понятным для конечных пользователей.

Groovy — База данных

Модуль Groovy-sql Groovy обеспечивает абстракцию более высокого уровня по сравнению с текущей технологией JDBC Java. Groovy SQL API поддерживает широкий спектр баз данных, некоторые из которых показаны ниже.

  • HSQLDB
  • оракул
  • SQL Server
  • MySQL
  • MongoDB

В нашем примере мы будем использовать MySQL DB в качестве примера. Чтобы использовать MySQL с Groovy, в первую очередь необходимо загрузить jar-файл MySQL jdbc с сайта mysql. Форма циновки MySQL будет показана ниже.

mysql-connector-java-5.1.38-bin

Затем убедитесь, что добавили вышеупомянутый jar-файл в classpath на вашей рабочей станции.

Подключение к базе данных

Перед подключением к базе данных MySQL убедитесь в следующем:

  • Вы создали базу данных TESTDB.
  • Вы создали таблицу EMPLOYEE в TESTDB.
  • В этой таблице есть поля FIRST_NAME, LAST_NAME, AGE, SEX и INCOME.
  • Идентификатор пользователя «testuser» и пароль «test123» установлены для доступа к TESTDB.
  • Убедитесь, что вы загрузили файл jar mysql и добавили его в путь к классам.
  • Вы прошли учебник по MySQL, чтобы понять основы MySQL

В следующем примере показано, как подключиться к базе данных MySQL «TESTDB».

import java.sql.*; 
import groovy.sql.Sql 

class Example {
   static void main(String[] args) {
      // Creating a connection to the database
      def sql = Sql.newInstance('jdbc:mysql://localhost:3306/TESTDB', 
         'testuser', 'test123', 'com.mysql.jdbc.Driver')
			
      // Executing the query SELECT VERSION which gets the version of the database
      // Also using the eachROW method to fetch the result from the database
   
      sql.eachRow('SELECT VERSION()'){ row ->
         println row[0]
      }
		
      sql.close()  
   } 
} 

При запуске этого скрипта он дает следующий результат —

5.7.10-log 
The Sql.newInstance method is used to establish a connection to the database.

Создание таблицы базы данных

Следующим шагом после подключения к базе данных является создание таблиц в нашей базе данных. В следующем примере показано, как создать таблицу в базе данных с помощью Groovy. Метод execute класса Sql используется для выполнения операторов в базе данных.

import java.sql.*; 
import groovy.sql.Sql 

class Example { 
   static void main(String[] args) {
      // Creating a connection to the database
      def sql = Sql.newInstance('jdbc:mysql://localhost:3306/TESTDB', 'testuser',  
         'test123', 'com.mysql.jdbc.Driver')
			
      def sqlstr = """CREATE TABLE EMPLOYEE ( 
         FIRST_NAME CHAR(20) NOT NULL,
         LAST_NAME CHAR(20),
         AGE INT,
         SEX CHAR(1),
         INCOME FLOAT )""" 
							
      sql.execute(sqlstr);
      sql.close() 
   } 
}

Операция вставки

Это необходимо, когда вы хотите создать свои записи в таблице базы данных.

пример

В следующем примере будет вставлена ​​запись в таблицу сотрудников. Код помещается в блок try catch, поэтому при успешном выполнении записи транзакция фиксируется в базе данных. Если транзакция завершается неудачно, выполняется откат.

import java.sql.*; 
import groovy.sql.Sql 

class Example {
   static void main(String[] args) { 
      // Creating a connection to the database
      def sql = Sql.newInstance('jdbc:mysql://localhost:3306/TESTDB', 'testuser', 
         'test123', 'com.mysql.jdbc.Driver')
			
      sql.connection.autoCommit = false
		
      def sqlstr = """INSERT INTO EMPLOYEE(FIRST_NAME,
         LAST_NAME, AGE, SEX, INCOME) VALUES ('Mac', 'Mohan', 20, 'M', 2000)""" 
      try {
         sql.execute(sqlstr);
         sql.commit()
         println("Successfully committed") 
      }catch(Exception ex) {
         sql.rollback()
         println("Transaction rollback") 
      }
		
      sql.close()
   } 
}

Предположим, если вы хотите просто выбрать определенные строки на основе критериев. В следующем коде показано, как можно добавить заполнитель параметра для поиска значений. Приведенный выше пример также может быть записан для получения параметров, как показано в следующем коде. Символ $ используется для определения параметра, который затем может быть заменен значениями при выполнении оператора sql.

import java.sql.*; 
import groovy.sql.Sql
 
class Example {
   static void main(String[] args) {
      // Creating a connection to the database
      def sql = Sql.newInstance('jdbc:mysql://localhost:3306/TESTDB', 'testuser', 
         'test123', 'com.mysql.jdbc.Driver')
			
      sql.connection.autoCommit = false  
      
      def firstname = "Mac"
      def lastname ="Mohan"
      def age = 20
      def sex = "M"
      def income = 2000  
		
      def sqlstr = "INSERT INTO EMPLOYEE(FIRST_NAME,LAST_NAME, AGE, SEX, 
         INCOME) VALUES " + "(${firstname}, ${lastname}, ${age}, ${sex}, ${income} )"
			
      try {
         sql.execute(sqlstr);
         sql.commit()
         println("Successfully committed") 
      } catch(Exception ex) {
         sql.rollback()
         println("Transaction rollback")
      }
		
      sql.close()
   }
}

ЧИТАЙТЕ Операцию

Чтение Операция с любой базой данных означает получение некоторой полезной информации из базы данных. Как только наше соединение с базой данных установлено, вы готовы сделать запрос в эту базу данных.

Операция чтения выполняется с использованием метода eachRow класса sql.

Синтаксис

eachRow(GString gstring, Closure closure) 

Выполняет заданный SQL-запрос, вызывая данное Закрытие для каждой строки набора результатов.

параметры

  • Gstring — оператор sql, который необходимо выполнить.

  • Закрытие — оператор закрытия для обработки строк, извлеченных из операции чтения. Выполняет заданный SQL-запрос, вызывая данное Закрытие для каждой строки набора результатов.

Gstring — оператор sql, который необходимо выполнить.

Закрытие — оператор закрытия для обработки строк, извлеченных из операции чтения. Выполняет заданный SQL-запрос, вызывая данное Закрытие для каждой строки набора результатов.

В следующем примере кода показано, как извлечь все записи из таблицы сотрудников.

import java.sql.*; 
import groovy.sql.Sql
 
class Example {
   static void main(String[] args) {
      // Creating a connection to the database
      def sql = Sql.newInstance('jdbc:mysql://localhost:3306/TESTDB', 'testuser', 
         'test123', 'com.mysql.jdbc.Driver')  
			
      sql.eachRow('select * from employee') {
         tp -> 
         println([tp.FIRST_NAME,tp.LAST_NAME,tp.age,tp.sex,tp.INCOME])
      }  
		
      sql.close()
   } 
}

Выход из вышеуказанной программы будет:

[Mac, Mohan, 20, M, 2000.0]

Операция обновления

ОБНОВЛЕНИЕ Операция в любой базе данных означает обновление одной или нескольких записей, которые уже доступны в базе данных. Следующая процедура обновляет все записи, имеющие SEX как «M». Здесь мы увеличиваем ВОЗРАСТ всех мужчин на один год.

import java.sql.*; 
import groovy.sql.Sql 

class Example {
   static void main(String[] args){
      // Creating a connection to the database
      def sql = Sql.newInstance('jdbc:mysql://localhost:3306/TESTDB', 'testuser', 
         'test@123', 'com.mysql.jdbc.Driver')
			
      sql.connection.autoCommit = false
      def sqlstr = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = 'M'" 
	  
      try {
         sql.execute(sqlstr);
         sql.commit()
         println("Successfully committed")
      }catch(Exception ex) {
         sql.rollback() 
         println("Transaction rollback")
      }
		
      sql.close()
   } 
}

УДАЛЕНИЕ Операция

Операция DELETE требуется, когда вы хотите удалить некоторые записи из вашей базы данных. Ниже приведена процедура удаления всех записей из EMPLOYEE, где возраст больше 20.

import java.sql.*; 
import groovy.sql.Sql 

class Example {
   static void main(String[] args) {
      // Creating a connection to the database
      def sql = Sql.newInstance('jdbc:mysql://localhost:3306/TESTDB', 'testuser', 
         'test@123', 'com.mysql.jdbc.Driver')
			
      sql.connection.autoCommit = false
      def sqlstr = "DELETE FROM EMPLOYEE WHERE AGE > 20"
   
      try {
         sql.execute(sqlstr);
         sql.commit()
         println("Successfully committed")
      }catch(Exception ex) {
         sql.rollback()
         println("Transaction rollback")
      }
   
      sql.close()
   } 
}

Выполнение транзакций

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

  • Атомарность — либо транзакция завершена, либо ничего не происходит вообще.

  • Согласованность — транзакция должна начинаться в согласованном состоянии и оставлять систему в согласованном состоянии.

  • Изоляция — промежуточные результаты транзакции не видны за пределами текущей транзакции.

  • Долговечность — после совершения транзакции последствия сохраняются даже после сбоя системы.

Атомарность — либо транзакция завершена, либо ничего не происходит вообще.

Согласованность — транзакция должна начинаться в согласованном состоянии и оставлять систему в согласованном состоянии.

Изоляция — промежуточные результаты транзакции не видны за пределами текущей транзакции.

Долговечность — после совершения транзакции последствия сохраняются даже после сбоя системы.

Вот простой пример реализации транзакций. Мы уже видели этот пример из нашей предыдущей темы об операции DELETE.

def sqlstr = "DELETE FROM EMPLOYEE WHERE AGE > 20" 
 
try {
   sql.execute(sqlstr); 
   sql.commit()
   println("Successfully committed") 
}catch(Exception ex) {
   sql.rollback()
   println("Transaction rollback") 
} 
sql.close()

Совершить операцию

Операция commit — это то, что сообщает базе данных, что нужно продолжить операцию и завершить все изменения в базе данных.

В нашем примере выше это достигается с помощью следующего утверждения —

sql.commit()

Операция отката

Если вы не удовлетворены одним или несколькими изменениями и хотите полностью отменить эти изменения, используйте метод отката. В нашем примере выше это достигается с помощью следующего утверждения —

sql.rollback()

Отключение баз данных

Чтобы отключить соединение с базой данных, используйте метод close.

sql.close()

Groovy — Строители

В процессе разработки программного обеспечения иногда разработчики тратят много времени на создание структур данных, классов доменов, XML, макетов графического интерфейса пользователя, потоков вывода и т. Д. Иногда код, используемый для создания этих конкретных требований, приводит к повторению одного и того же фрагмента кода. код во многих местах. Здесь строители Groovy вступают в игру. В Groovy есть строители, которые можно использовать для создания стандартных объектов и структур. Эти сборщики экономят время, так как разработчикам не нужно писать собственный код для создания этих сборщиков. В этой главе мы рассмотрим различные конструкторы, доступные в Groovy.

Качели Строитель

В groovy также можно создавать графические пользовательские интерфейсы, используя свинг-компоновщики, доступные в groovy. Основным классом для разработки компонентов Swing является класс SwingBuilder. Этот класс имеет много методов для создания графических компонентов, таких как —

  • JFrame — это для создания элемента frame.

  • JTextField — используется для создания компонента текстового поля .

JFrame — это для создания элемента frame.

JTextField — используется для создания компонента текстового поля .

Давайте рассмотрим простой пример того, как создать приложение Swing, используя класс SwingBuilder. В следующем примере вы можете увидеть следующие пункты —

  • Вам необходимо импортировать классы groovy.swing.SwingBuilder и javax.swing. *.

  • Все компоненты, отображаемые в приложении Swing, являются частью класса SwingBuilder.

  • Для самого кадра вы можете указать начальное расположение и размер кадра. Вы также можете указать заголовок кадра.

  • Вам нужно установить для свойства Visibility значение true, чтобы фрейм отображался.

Вам необходимо импортировать классы groovy.swing.SwingBuilder и javax.swing. *.

Все компоненты, отображаемые в приложении Swing, являются частью класса SwingBuilder.

Для самого кадра вы можете указать начальное расположение и размер кадра. Вы также можете указать заголовок кадра.

Вам нужно установить для свойства Visibility значение true, чтобы фрейм отображался.

import groovy.swing.SwingBuilder 
import javax.swing.* 

// Create a builder 
def myapp = new SwingBuilder()

// Compose the builder 
def myframe = myapp.frame(title : 'Tutorials Point', location : [200, 200], 
   size : [400, 300], defaultCloseOperation : WindowConstants.EXIT_ON_CLOSE {         
      label(text : 'Hello world')
   } 
	
// The following  statement is used for displaying the form 
frame.setVisible(true)

Вывод вышеуказанной программы приведен ниже. Следующий вывод показывает JFrame вместе с JLabel с текстом Hello World.

JLabel с текстом

Давайте посмотрим на наш следующий пример для создания экрана ввода с текстовыми полями. В следующем примере мы хотим создать форму с текстовыми полями для имени ученика, предмета и названия школы. В следующем примере вы можете увидеть следующие ключевые моменты —

  • Мы определяем макет для наших элементов управления на экране. В этом случае мы используем Grid Layout.
  • Мы используем свойство выравнивания для наших меток.
  • Мы используем метод textField для отображения текстовых полей на экране.
import groovy.swing.SwingBuilder 
import javax.swing.* 
import java.awt.*
 
// Create a builder 
def myapp = new SwingBuilder() 

// Compose the builder 
def myframe = myapp.frame(title : 'Tutorials Point', location : [200, 200], 
   size : [400, 300], defaultCloseOperation : WindowConstants.EXIT_ON_CLOSE) { 
      panel(layout: new GridLayout(3, 2, 5, 5)) { 
         label(text : 'Student Name:', horizontalAlignment : JLabel.RIGHT) 
         textField(text : '', columns : 10) 
			
         label(text : 'Subject Name:', horizontalAlignment : JLabel.RIGHT) 
         textField(text : '', columns : 10)
			
         label(text : 'School Name:', horizontalAlignment : JLabel.RIGHT) 
         textField(text : '', columns : 10) 
      } 
   } 
	
// The following  statement is used for displaying the form 
myframe.setVisible(true)

Вывод вышеуказанной программы приведен ниже —

Форма отображения

Обработчики событий

Теперь давайте посмотрим на обработчики событий. Обработчики событий используются для кнопки для выполнения некоторой обработки при нажатии кнопки. Каждый вызов псевдометража кнопки включает в себя параметр actionPerformed. Это представляет блок кода, представленный как замыкание.

Давайте посмотрим на наш следующий пример для создания экрана с 2 кнопками. При нажатии любой кнопки соответствующее сообщение отправляется на экран консоли. В следующем примере вы можете увидеть следующие ключевые моменты —

  • Для каждой определенной кнопки мы используем метод actionPerformed и определяем замыкание для отправки некоторого вывода на консоль при нажатии кнопки.

Для каждой определенной кнопки мы используем метод actionPerformed и определяем замыкание для отправки некоторого вывода на консоль при нажатии кнопки.

import groovy.swing.SwingBuilder 
import javax.swing.* 
import java.awt.* 

def myapp = new SwingBuilder()
  
def buttonPanel = {
   myapp.panel(constraints : BorderLayout.SOUTH) {
	
      button(text : 'Option A', actionPerformed : {
         println 'Option A chosen'
      })
		
      button(text : 'Option B', actionPerformed : {
         println 'Option B chosen'
      })
   }
}
  
def mainPanel = {
   myapp.panel(layout : new BorderLayout()) {
      label(text : 'Which Option do you want', horizontalAlignment : 
      JLabel.CENTER,
      constraints : BorderLayout.CENTER)
      buttonPanel()
   }
}
  
def myframe = myapp.frame(title : 'Tutorials Point', location : [100, 100],
   size : [400, 300], defaultCloseOperation : WindowConstants.EXIT_ON_CLOSE){
      mainPanel()
   }
	
myframe.setVisible(true)

Вывод вышеуказанной программы приведен ниже. При нажатии на любую кнопку необходимое сообщение отправляется на экран журнала консоли.

Кнопка выбора

Другой вариант приведенного выше примера заключается в определении методов, которые могут выступать в качестве обработчиков. В следующем примере мы определяем 2 обработчика DisplayA и DisplayB.

import groovy.swing.SwingBuilder 
import javax.swing.* 
import java.awt.* 

def myapp = new SwingBuilder()
  
def DisplayA = {
   println("Option A") 
} 

def DisplayB = {
   println("Option B")
}

def buttonPanel = {
   myapp.panel(constraints : BorderLayout.SOUTH) {
      button(text : 'Option A', actionPerformed : DisplayA) 
      button(text : 'Option B', actionPerformed : DisplayB)
   }
}  

def mainPanel = {
   myapp.panel(layout : new BorderLayout()) {
      label(text : 'Which Option do you want', horizontalAlignment : JLabel.CENTER,
      constraints : BorderLayout.CENTER)
      buttonPanel()
   }
}  

def myframe = myapp.frame(title : 'Tutorials Point', location : [100, 100],
   size : [400, 300], defaultCloseOperation : WindowConstants.EXIT_ON_CLOSE) {
      mainPanel()
   } 
	
myframe.setVisible(true) 

Вывод вышеуказанной программы останется таким же, как в предыдущем примере.

DOM Builder

Конструктор DOM может использоваться для анализа HTML, XHTML и XML и преобразования его в дерево DOM W3C.

В следующем примере показано, как можно использовать построитель DOM.

String records = '''
   <library>
	
      <Student>
         <StudentName division = 'A'>Joe</StudentName>
         <StudentID>1</StudentID>
      </Student>
	  
      <Student>
         <StudentName division = 'B'>John</StudentName>
         <StudentID>2</StudentID>
      </Student>
	  
      <Student>
         <StudentName division = 'C'>Mark</StudentName>
         <StudentID>3</StudentID>
      </Student>
		
   </library>'''
   
def rd = new StringReader(records) 
def doc = groovy.xml.DOMBuilder.parse(rd)

JsonBuilder

JsonBuilder используется для создания объектов типа JSON.

В следующем примере показано, как можно использовать компоновщик Json.

Live Demo

def builder = new groovy.json.JsonBuilder() 

def root = builder.students {
   student {
      studentname 'Joe'
      studentid '1'
		
      Marks(
         Subject1: 10,
         Subject2: 20,
         Subject3:30,
      )
   } 
} 
println(builder.toString());

Вывод вышеуказанной программы приведен ниже. Вывод clearlt показывает, что Jsonbuilder смог построить объект json из структурированного набора узлов.

{"students":{"student":{"studentname":"Joe","studentid":"1","Marks":{"Subject1":10,
"S ubject2":20,"Subject3":30}}}}

Jsonbuilder также может взять список и преобразовать его в объект json. В следующем примере показано, как это можно сделать.

def builder = new groovy.json.JsonBuilder() 
def lst = builder([1, 2, 3]) 
println(builder.toString());

Вывод вышеуказанной программы приведен ниже.

[1,2,3]

JsonBuilder также может быть использован для классов. В следующем примере показано, как объекты класса могут стать входными данными для конструктора json.

Live Demo

def builder = new groovy.json.JsonBuilder() 

class Student {
   String name  
} 

def studentlist = [new Student (name: "Joe"), new Student (name: "Mark"), 
   new Student (name: "John")] 
	
builder studentlist, { Student student ->name student.name} 
println(builder)

Вывод вышеуказанной программы приведен ниже.

[{"name":"Joe"},{"name":"Mark"},{"name":"John"}] 

NodeBuilder

NodeBuilder используется для создания вложенных деревьев объектов Node для обработки произвольных данных. Пример использования Nodebuilder показан ниже.

def nodeBuilder = new NodeBuilder() 

def studentlist = nodeBuilder.userlist {
   user(id: '1', studentname: 'John', Subject: 'Chemistry')
   user(id: '2', studentname: 'Joe', Subject: 'Maths')
   user(id: '3', studentname: 'Mark', Subject: 'Physics') 
} 

println(studentlist)

FileTreeBuilder

FileTreeBuilder — это компоновщик для создания структуры каталогов файлов из спецификации. Ниже приведен пример использования FileTreeBuilder.

tmpDir = File.createTempDir() 
def fileTreeBuilder = new FileTreeBuilder(tmpDir) 

fileTreeBuilder.dir('main') {
   dir('submain') {
      dir('Tutorial') {
        file('Sample.txt', 'println "Hello World"')
      }
   } 
}

После выполнения вышеуказанного кода в папке main / submain / Tutorial будет создан файл с именем sample.txt. И в файле sample.txt будет текст «Hello World».

Groovy — Командная строка

Оболочка Groovy, известная как groovysh, может быть легко использована для оценки выражений groovy, определения классов и запуска простых программ. Оболочка командной строки устанавливается при установке Groovy.

Ниже приведены параметры командной строки, доступные в Groovy.

Параметр командной строки ФИО подробности
—color [= ФЛАГ] Включить или отключить использование цветов ANSI
-D —define = ИМЯ = ЗНАЧЕНИЕ Определить системное свойство
-T —terminal = ТИП Укажите ТИП терминала для использования
-V —версия Показать версию
-classpath Укажите, где искать файлы классов — должен быть первый аргумент
-cp —classpath Псевдонимы для ‘-classpath’
-d —debug —debug Включить отладочный вывод
-e —evaluate = Arg Оцените опцию fist при запуске интерактивного сеанса
-час —Помогите Показать это справочное сообщение
-q —тихо Подавить лишний вывод
-v —подробный Включить подробный вывод

На следующем снимке показан простой пример выражения, выполняемого в оболочке Groovy. В следующем примере мы просто печатаем «Hello World» в отличной оболочке.

Groovy Shell

Классы и Функции

Очень просто определить класс в командной строке, создать новый объект и вызвать метод класса. В следующем примере показано, как это можно реализовать. В следующем примере мы создаем простой класс Student с помощью простого метода. В самой командной строке мы создаем объект класса и вызываем метод Display.

Создать стандартный класс

Очень легко определить метод в командной строке и вызвать метод. Обратите внимание, что метод определяется с использованием типа def. Также обратите внимание, что мы включили параметр с именем name, который затем заменяется фактическим значением при вызове метода Display. В следующем примере показано, как это можно реализовать.

запросить и вызвать команду

команды

Оболочка имеет ряд различных команд, которые обеспечивают расширенный доступ к среде оболочки. Ниже приведен список их и что они делают.

Sr.No Команда & smp; Описание команды
1

:Помогите

(: h) Показать это справочное сообщение

2

?

(:?) Псевдоним:: помочь

3

:выход

(: x) Выход из оболочки

4

:уволиться

(: q) Псевдоним для:: выхода

5

Импортировать

(: i) Импортировать класс в пространство имен

6

: дисплей

(: d) Показать текущий буфер

7

:Чисто

(: c) Очистить буфер и сбросить счетчик подсказок

8

:шоу

(: S) Показать переменные, классы или импорт

9

:осмотреть

(: n) Проверьте переменную или последний результат с помощью браузера объектов GUI

10

: продувка

(: p) Очистить переменные, классы, импорт или настройки

11

:редактировать

(: e) Редактировать текущий буфер

12

: нагрузка

(: l) Загрузить файл или URL в буфер

13

,

(:.) Псевдоним для:: load

14

.спасти

(: s) Сохранить текущий буфер в файл

15

.record

(: r) записать текущий сеанс в файл

16

: псевдоним

(: a) Создать псевдоним

17

:задавать

(: =) Установить (или список) предпочтений

18

:регистр

(: rc) Регистрирует новую команду в оболочке

19

: документ

(: D) Открывает окно браузера, в котором отображается документ для аргумента

20

: история

(: H) Отображение, управление и вызов истории редактирования строки

:Помогите

(: h) Показать это справочное сообщение

?

(:?) Псевдоним:: помочь

:выход

(: x) Выход из оболочки

:уволиться

(: q) Псевдоним для:: выхода

Импортировать

(: i) Импортировать класс в пространство имен

: дисплей

(: d) Показать текущий буфер

:Чисто

(: c) Очистить буфер и сбросить счетчик подсказок

:шоу

(: S) Показать переменные, классы или импорт

:осмотреть

(: n) Проверьте переменную или последний результат с помощью браузера объектов GUI

: продувка

(: p) Очистить переменные, классы, импорт или настройки

:редактировать

(: e) Редактировать текущий буфер

: нагрузка

(: l) Загрузить файл или URL в буфер

,

(:.) Псевдоним для:: load

.спасти

(: s) Сохранить текущий буфер в файл

.record

(: r) записать текущий сеанс в файл

: псевдоним

(: a) Создать псевдоним

:задавать

(: =) Установить (или список) предпочтений

:регистр

(: rc) Регистрирует новую команду в оболочке

: документ

(: D) Открывает окно браузера, в котором отображается документ для аргумента

: история

(: H) Отображение, управление и вызов истории редактирования строки

Groovy — модульное тестирование

Фундаментальной единицей объектно-ориентированной системы является класс. Поэтому юнит-тестирование состоит из тестирования в классе. Используемый подход состоит в том, чтобы создать объект тестируемого класса и использовать его для проверки того, что выбранные методы выполняются должным образом. Не каждый метод может быть проверен, поскольку не всегда практично проверять каждую вещь. Но модульное тестирование должно проводиться для ключевых и критических методов.

JUnit — это среда тестирования с открытым исходным кодом, которая является общепринятым отраслевым стандартом для автоматизированного модульного тестирования кода Java. К счастью, инфраструктуру JUnit можно легко использовать для тестирования классов Groovy. Все, что требуется, — это расширить класс GroovyTestCase, который является частью стандартной среды Groovy. Класс теста Groovy основан на тесте Junit.

Написание простого теста Junit

Предположим, у нас есть следующий класс, определенный в файле класса приложения —

Live Demo

class Example {
   static void main(String[] args) {
      Student mst = new Student();
      mst.name = "Joe";
      mst.ID = 1;
      println(mst.Display())
   } 
} 
 
public class Student {
   String name;
   int ID;
	
   String Display() {
      return name +ID;
   }  
}

Вывод вышеуказанной программы приведен ниже.

Joe1

А теперь предположим, что мы хотим написать тестовый пример для класса Student. Типичный тестовый пример будет выглядеть так, как показано ниже. Следующие пункты должны быть отмечены о следующем коде —

  • Класс тестового случая расширяет класс GroovyTestCase
  • Мы используем оператор assert, чтобы гарантировать, что метод Display возвращает правильную строку.
class StudentTest extends GroovyTestCase {
   void testDisplay() {
      def stud = new Student(name : 'Joe', ID : '1')
      def expected = 'Joe1'
      assertToString(stud.Display(), expected)
   }
}

Groovy Test Suite

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

  • GroovyTestSuite используется для инкапсуляции всех тестовых случаев в один.

  • В следующем примере мы предполагаем, что у нас есть два файла тестовых примеров, один из которых называется StudentTest, а другой — EmployeeTest, который содержит все необходимые тесты.

GroovyTestSuite используется для инкапсуляции всех тестовых случаев в один.

В следующем примере мы предполагаем, что у нас есть два файла тестовых примеров, один из которых называется StudentTest, а другой — EmployeeTest, который содержит все необходимые тесты.

import groovy.util.GroovyTestSuite 
import junit.framework.Test 
import junit.textui.TestRunner 

class AllTests { 
   static Test suite() { 
      def allTests = new GroovyTestSuite() 
      allTests.addTestSuite(StudentTest.class) 
      allTests.addTestSuite(EmployeeTest.class) 
      return allTests 
   } 
} 

TestRunner.run(AllTests.suite())

Groovy — шаблоны двигателей

Шаблонный движок Groovy работает как слияние (автоматическое добавление имен и адресов из базы данных в письма и конверты, чтобы упростить отправку почты, особенно рекламы, на многие адреса), но это гораздо более общий характер.

Простые шаблоны в строках

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

def name = "Groovy" 
println "This Tutorial is about ${name}"

Если приведенный выше код выполняется в Groovy, будет показан следующий вывод. Вывод ясно показывает, что $ name было заменено значением, которое было назначено оператором def.

Простой шаблонизатор

Ниже приведен пример SimpleTemplateEngine, который позволяет вам использовать JSP-подобные скриптлеты и выражения EL в вашем шаблоне для генерации параметризованного текста. Механизм шаблонов позволяет вам связать список параметров и их значений, чтобы их можно было заменить в строке, которая имеет определенные заполнители.

def text ='This Tutorial focuses on $TutorialName. In this tutorial you will learn 

about $Topic'  

def binding = ["TutorialName":"Groovy", "Topic":"Templates"]  
def engine = new groovy.text.SimpleTemplateEngine() 
def template = engine.createTemplate(text).make(binding) 

println template

Если приведенный выше код выполняется в Groovy, будет показан следующий вывод.

Давайте теперь используем функцию шаблонов для XML-файла. В качестве первого шага добавим следующий код в файл с именем Student.template. В следующем файле вы заметите, что мы добавили не фактические значения для элементов, а заполнители. Таким образом, $ name, $ is и $ subject все помещаются как заполнители, которые нужно будет заменить во время выполнения.

<Student> 
   <name>${name}</name> 
   <ID>${id}</ID> 
   <subject>${subject}</subject> 
</Student>

Теперь давайте добавим наш код скрипта Groovy, чтобы добавить функциональность, которую можно использовать для замены вышеуказанного шаблона фактическими значениями. Следующие вещи следует отметить о следующем коде.

  • Сопоставление заполнителей с фактическими значениями выполняется с помощью привязки и SimpleTemplateEngine. Привязка представляет собой карту с заполнителями в качестве ключей и замен в качестве значений.

Сопоставление заполнителей с фактическими значениями выполняется с помощью привязки и SimpleTemplateEngine. Привязка представляет собой карту с заполнителями в качестве ключей и замен в качестве значений.

import groovy.text.* 
import java.io.* 

def file = new File("D:/Student.template") 
def binding = ['name' : 'Joe', 'id' : 1, 'subject' : 'Physics']
				  
def engine = new SimpleTemplateEngine() 
def template = engine.createTemplate(file) 
def writable = template.make(binding) 

println writable

Если приведенный выше код выполняется в Groovy, будет показан следующий вывод. Из выходных данных видно, что значения успешно заменены в соответствующих заполнителях.

<Student> 
   <name>Joe</name> 
   <ID>1</ID> 
   <subject>Physics</subject> 
</Student>

StreamingTemplateEngine

Механизм StreamingTemplateEngine — это еще один шаблонизатор, доступный в Groovy. Это в некотором роде эквивалентно SimpleTemplateEngine, но создает шаблон с использованием записываемых замыканий, что делает его более масштабируемым для больших шаблонов. В частности, этот шаблонизатор может обрабатывать строки размером более 64 КБ.

Ниже приведен пример использования StreamingTemplateEngine:

def text = '''This Tutorial is <% out.print TutorialName %> The Topic name 

is ${TopicName}''' 
def template = new groovy.text.StreamingTemplateEngine().createTemplate(text)
  
def binding = [TutorialName : "Groovy", TopicName  : "Templates",]
String response = template.make(binding) 
println(response)

Если приведенный выше код выполняется в Groovy, будет показан следующий вывод.

This Tutorial is Groovy The Topic name is Templates

XMLTemplateEngine

XmlTemplateEngine используется в шаблонных сценариях, где источником шаблона и ожидаемым выводом являются XML. Шаблоны используют обычные нотации $ {expression} и $ variable для вставки произвольного выражения в шаблон.

Ниже приведен пример использования XMLTemplateEngine.

Live Demo

def binding = [StudentName: 'Joe', id: 1, subject: 'Physics'] 
def engine = new groovy.text.XmlTemplateEngine() 

def text = '''\
   <document xmlns:gsp='http://groovy.codehaus.org/2005/gsp'>
      <Student>
         <name>${StudentName}</name>
         <ID>${id}</ID>
         <subject>${subject}</subject>
      </Student>
   </document> 
''' 

def template = engine.createTemplate(text).make(binding) 
println template.toString()

Если приведенный выше код выполняется в Groovy, будет показан следующий вывод

   Joe
    
    
   1
    
    
   Physics 

Groovy — мета-объектное программирование

Мета-объектное программирование или MOP могут использоваться для динамического вызова методов, а также для создания классов и методов на лету.

Так что это значит? Давайте рассмотрим класс с именем Student, который является своего рода пустым классом без переменных-членов или методов. Предположим, вам нужно было вызывать следующие утверждения для этого класса.

Def myStudent = new Student() 
myStudent.Name = ”Joe”; 
myStudent.Display()

Теперь в мета-объектном программировании, даже если у класса нет переменной-члена Name или метода Display (), приведенный выше код будет работать.

Как это может работать? Что ж, чтобы это сработало, нужно реализовать интерфейс GroovyInterceptable, чтобы подключиться к процессу исполнения Groovy. Ниже приведены методы, доступные для этого интерфейса.

Public interface GroovyInterceptable { 
   Public object invokeMethod(String methodName, Object args) 
   Public object getproperty(String propertyName) 
   Public object setProperty(String propertyName, Object newValue) 
   Public MetaClass getMetaClass() 
   Public void setMetaClass(MetaClass metaClass) 
}

Таким образом, в приведенном выше описании интерфейса, предположим, что если бы вам пришлось реализовать invokeMethod (), он был бы вызван для каждого метода, который существует или не существует.

Недостающие свойства

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

  • В классе Student не определена переменная-член с именем или идентификатором.

  • Класс Student реализует интерфейс GroovyInterceptable.

  • Существует параметр с именем dynamicProps, который будет использоваться для хранения значений переменных-членов, которые создаются на лету.

  • Методы getproperty и setproperty были реализованы для получения и установки значений свойств класса во время выполнения.

В классе Student не определена переменная-член с именем или идентификатором.

Класс Student реализует интерфейс GroovyInterceptable.

Существует параметр с именем dynamicProps, который будет использоваться для хранения значений переменных-членов, которые создаются на лету.

Методы getproperty и setproperty были реализованы для получения и установки значений свойств класса во время выполнения.

Live Demo

class Example {
   static void main(String[] args) {
      Student mst = new Student();
      mst.Name = "Joe";
      mst.ID = 1;
		
      println(mst.Name);
      println(mst.ID);
   }
}

class Student implements GroovyInterceptable { 
   protected dynamicProps=[:]
	
   void setProperty(String pName,val) {
      dynamicProps[pName] = val
   }
   
   def getProperty(String pName) {
      dynamicProps[pName]
   } 
} 

Вывод следующего кода будет:

Joe 
1

Недостающие методы

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

  • Класс Student теперь реализует метод invokeMethod, который вызывается независимо от того, существует метод или нет.

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

Live Demo

class Example {
   static void main(String[] args) {
      Student mst = new Student();
      mst.Name = "Joe";
      mst.ID = 1;
		
      println(mst.Name);
      println(mst.ID);
      mst.AddMarks();
   } 
}
 
class Student implements GroovyInterceptable {
   protected dynamicProps = [:]  
    
   void setProperty(String pName, val) {
      dynamicProps[pName] = val
   } 
   
   def getProperty(String pName) {
      dynamicProps[pName]
   }
   
   def invokeMethod(String name, Object args) {
      return "called invokeMethod $name $args"
   }
}

Вывод следующего кода будет показан ниже. Обратите внимание, что нет ошибки пропущенного исключения метода, даже если метод Display не существует.

Joe 
1 

метаклассов

Эта функциональность связана с реализацией MetaClass. В реализации по умолчанию вы можете получить доступ к полям, не вызывая их методы получения и установки. В следующем примере показано, как с помощью функции metaClass мы можем изменить значение приватных переменных в классе.

Live Demo

class Example {
   static void main(String[] args) {
      Student mst = new Student();
      println mst.getName()
      mst.metaClass.setAttribute(mst, 'name', 'Mark')
      println mst.getName()
   } 
} 

class Student {
   private String name = "Joe";
	
   public String getName() {
      return this.name;
   } 
}

Вывод следующего кода будет:

Joe 
Mark

Метод отсутствует

Groovy поддерживает концепцию метода Missing. Этот метод отличается от invokeMethod тем, что он вызывается только в случае неудачной отправки метода, когда не удается найти метод для данного имени и / или заданных аргументов. В следующем примере показано, как можно использовать methodMissing.

Live Demo

class Example {
   static void main(String[] args) {
      Student mst = new Student();
      mst.Name = "Joe";
      mst.ID = 1;
		
      println(mst.Name);
      println(mst.ID);
      mst.AddMarks();
   } 
} 

class Student implements GroovyInterceptable {
   protected dynamicProps = [:]  
    
   void setProperty(String pName, val) {
      dynamicProps[pName] = val
   }
   
   def getProperty(String pName) {
      dynamicProps[pName]
   }
   
   def methodMissing(String name, def args) {         
      println "Missing method"
   }  
}

Вывод следующего кода будет: