1. 개요

Groovy 에서는 Java 에서와 마찬가지로 List으로 작업할 수 있습니다 . 그러나 확장 방법에 대한 지원으로 훨씬 더 많은 기능이 제공됩니다.

이 예제에서는 List 변경, 필터링 및 정렬에 대한 Groovy의 기능을 살펴보겠습니다.

2. Groovy List 만들기

Groovy는 컬렉션으로 작업할 때 동적 타이핑 및 리터럴 구문에 대한 지원을 활용하는 흥미로운 단축키를 제공합니다.

속기 구문을 사용하여 몇 가지 값이 포함된 List을 만들어 보겠습니다.

def list = [1,2,3]

마찬가지로 빈 List을 만들 수 있습니다.

def emptyList = []

기본적으로 Groovy는 java.util.ArrayList 인스턴스를 생성합니다 .

그러나 생성할 List 유형을 지정할 수도 있습니다 .

def linkedList = [1,2,3] as LinkedList
ArrayList arrList = [1,2,3]

다음으로 List은 생성자 인수를 사용하여 다른 List을 만드는 데 사용할 수 있습니다.

def copyList = new ArrayList(arrList)

복제를 통해 이를 수행할 수도 있습니다.

def cloneList = arrList.clone()

복제는 List의 단순 복사본을 생성합니다.

Groovy는 "==" 연산자를 사용하여 두 List의 요소가 동일한지 비교합니다.

이전 예제에서 계속해서 cloneListarrlist를 비교하면 결과는 true 입니다 .

assertTrue(cloneList == arrList)

이제 List에서 몇 가지 일반적인 작업을 수행하는 방법을 살펴보겠습니다.

3. List에서 항목 검색

리터럴 구문을 사용하여 List에서 항목을 가져올 수 있습니다.

def list = ["Hello", "World"]
assertTrue(list[1] == "World")

또는 get()getAt() 메서드를 사용할 수 있습니다 .

assertTrue(list.get(1) == "World")
assertTrue(list.getAt(1) == "World")

양수 및 음수 인덱스를 모두 사용하여 List에서 항목을 가져올 수도 있습니다.

음수 인덱스를 사용하면 List을 오른쪽에서 왼쪽으로 읽습니다.

assertTrue(list[-1] == "World")
assertTrue(list.getAt(-2) == "Hello")

get () 메서드는 음수 인덱스를 지원하지 않습니다.

4. List에 항목 추가

List에 항목을 추가하는 방법에는 여러 가지가 있습니다.

빈 List을 정의하고 여기에 몇 가지 항목을 추가해 보겠습니다.

def list = []

list << 1
list.add("Apple")
assertTrue(list == [1, "Apple"])

다음으로 항목을 배치할 인덱스를 지정할 수도 있습니다.

또한 List의 길이가 지정된 인덱스보다 작으면 Groovy는 차이만큼 null 값을 추가합니다 .

list[2] = "Box"
list[4] = true
assertTrue(list == [1, "Apple", "Box", null, true])

마지막으로 "+=" 연산자를 사용하여 List에 새 항목을 추가할 수 있습니다.

다른 접근 방식과 비교하여 이 연산자는 새 List 개체를 만들고 변수 List 에 할당합니다 .

def list2 = [1,2]
list += list2
list += 12        
assertTrue(list == [1, 6.0, "Apple", "Box", null, true, 1, 2, 12])

5. List의 항목 업데이트

리터럴 구문 또는 set() 메서드를 사용하여 List의 항목을 업데이트할 수 있습니다 .

def list =[1, "Apple", 80, "App"]
list[1] = "Box"
list.set(2,90)
assertTrue(list == [1, "Box", 90,  "App"])

이 예에서는 인덱스 1과 2의 항목이 새 값으로 업데이트됩니다.

6. List에서 항목 제거

remove() 메서드 를 사용하여 특정 인덱스에서 항목을 제거할 수 있습니다 .

def list = [1,2,3,4,5,5,6,6,7]
list.remove(3)
assertTrue(list == [1,2,3,5,5,6,6,7])

removeElement() 메서드를 사용하여 요소를 제거할 수도 있습니다 .

이렇게 하면 List에서 요소의 첫 번째 항목이 제거됩니다.

list.removeElement(5)
assertTrue(list == [1,2,3,5,6,6,7])

또한 빼기 연산자를 사용하여 List에서 요소의 모든 항목을 제거할 수 있습니다.

그러나 이 연산자는 기본 List을 변경하지 않고 새 List을 반환합니다.

assertTrue(list - 6 == [1,2,3,5,7])

7. List 반복

Groovy는 기존 Java Collections API에 새로운 메소드를 추가했습니다.

이러한 메서드는 상용구 코드를 캡슐화하여 필터링, 검색, 정렬, 집계 등과 같은 작업을 단순화합니다. 또한 클로저 및 출력 데이터 구조를 포함한 광범위한 입력을 지원합니다.

List을 반복하는 두 가지 방법부터 살펴보겠습니다.

each () 메서드는 클로저를 허용하며 Java의 foreach() 메서드와 매우 유사합니다.

Groovy는 각 반복에서 현재 요소에 해당하는 암시적 매개변수 it를 전달합니다.

def list = [1,"App",3,4]
list.each {println it * 2}

다른 메서드인 eachWithIndex() 는 현재 요소 외에 현재 인덱스 값을 제공합니다.

list.eachWithIndex{ it, i -> println "$i : $it" }

8. 필터링

필터링은 List에서 자주 수행되는 또 다른 작업이며 Groovy는 선택할 수 있는 다양한 방법을 제공합니다.

작동할 List을 정의해 보겠습니다.

def filterList = [2,1,3,4,5,6,76]

조건과 일치하는 첫 번째 객체를 찾기 위해 find를 사용할 수 있습니다 .

assertTrue(filterList.find {it > 3} == 4)

조건과 일치하는 모든 객체를 찾으려면 findAll을 사용할 수 있습니다 .

assertTrue(filterList.findAll {it > 3} == [4,5,6,76])

다른 예를 살펴보겠습니다.

여기서 우리는 숫자인 모든 요소의 List을 원합니다.

assertTrue(filterList.findAll {it instanceof Number} == [2,1,3,4,5,6,76])

또는 grep 메소드를 사용하여 동일한 작업을 수행할 수 있습니다.

assertTrue(filterList.grep( Number ) == [2,1,3,4,5,6,76])

grepfind 메소드 의 차이점은 grep이 객체클로저 를 인수로 받아들일 수 있다는 것입니다 .

따라서 조건문을 최소한으로 줄일 수 있습니다.

assertTrue(filterList.grep {it > 6} == [76])

또한 grep은 Object#isCase(java.lang.Object)를 사용하여 List의 각 요소에 대한 조건을 평가합니다.

때로는 List의 고유한 항목에만 관심이 있을 수 있습니다. 이 목적으로 사용할 수 있는 두 가지 오버로드된 메서드가 있습니다.

unique () 메서드는 선택적으로 클로저를 받아들이고 클로저 조건과 일치하는 요소만 기본 List에 유지하고 나머지는 버립니다.

고유성을 결정하기 위해 기본적으로 자연 순서를 사용합니다.

def uniqueList = [1,3,3,4]
uniqueList.unique()
assertTrue(uniqueList == [1,3,4])

또는 요구 사항이 기본 List을 변경하지 않는 경우 toUnique() 메서드를 사용할 수 있습니다.

assertTrue(["A", "B", "Ba", "Bat", "Cat"].toUnique {it.size()} == ["A", "Ba", "Bat"])

List의 일부 또는 모든 항목이 특정 조건을 충족하는지 확인하려면 every()any() 메서드를 사용할 수 있습니다.

every () 메서드는 List의 모든 요소에 대해 클로저의 조건을 평가합니다.

그런 다음 List의 모든 요소가 조건을 충족하는 경우 에만 true를 반환합니다.

def conditionList = [2,1,3,4,5,6,76]
assertFalse(conditionList.every {it < 6})

반면에 any() 메서드는 List 요소가 조건을 충족하는 경우 true를 반환합니다.

assertTrue(conditionList.any {it % 2 == 0})

9. 분류

기본적으로 Groovy는 자연 순서에 따라 List의 항목을 정렬합니다.

assertTrue([1,2,1,0].sort() == [0,1,1,2])

그러나 사용자 지정 정렬 논리를 사용하여 Comparator를 전달할 수도 있습니다 .

Comparator mc = {a,b -> a == b? 0: a < b? 1 : -1}
def list = [1,2,1,0]
list.sort(mc)
assertTrue(list == [2,1,1,0])

또한 min() 또는 max() 메서드를 사용하여 명시적으로 sort()를 호출하지 않고 최대값 또는 최소값을 찾을 수 있습니다 .

def strList = ["na", "ppp", "as"]
assertTrue(strList.max() == "ppp")
Comparator minc = {a,b -> a == b? 0: a < b? -1 : 1}
def numberList = [3, 2, 0, 7]
assertTrue(numberList.min(minc) == 0)

10. 수집

경우에 따라 List의 항목을 수정하고 업데이트된 값으로 다른 List을 반환해야 할 수 있습니다.

다음과 같이 collect() 메서드를 사용하여 이를 수행할 수 있습니다 .

def list = ["Kay","Henry","Justin","Tom"]
assertTrue(list.collect{"Hi " + it} == ["Hi Kay","Hi Henry","Hi Justin","Hi Tom"])

11. 가입

때때로 List의 항목을 결합해야 할 수도 있습니다.

이를 위해 join() 메서드를 사용할 수 있습니다.

assertTrue(["One","Two","Three"].join(",") == "One,Two,Three")

12. 결론

이 기사에서는 Groovy가 Java Collections API에 추가하는 몇 가지 확장 기능을 다루었습니다.

리터럴 구문을 살펴본 다음 List에서 항목을 생성, 업데이트, 제거 및 검색하는 사용법을 살펴보는 것으로 시작했습니다.

마지막으로 List 반복, 필터링, 검색, 수집, 결합 및 정렬에 대한 Groovy의 지원을 살펴보았습니다.

항상 그렇듯이 기사에서 논의된 모든 예제는 GitHub에서 사용할 수 있습니다 .

res – REST with Spring (eBook) (everywhere)