Есть ли в Groovy специальный синтаксис для элемента find в коллекции или исключения исключения, если оно не найдено? - PullRequest
1 голос
/ 10 мая 2019

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

def sampleList = [1, 2]
def element = sampleList.find { it == 3 }
if (!element) {
    throw new IllegalStateException('Element not found!')
}

С помощью Java Streams это немного проще:

def sampleList = [1, 2]
sampleList.stream().filter { it == 3 }.findFirst().orElseThrow {
    new IllegalStateException('Element not found!')
}

Есть ли какой-нибудь другой лаконичный Groovy?синтаксис для выполнения той же задачи?

1 Ответ

1 голос
/ 10 мая 2019

Вариант 1 Я думаю, что это самое ясное, используя API Optional:

def sampleList = [1, 2]
def element = Optional.ofNullable(sampleList.find{it==3}).orElseThrow{new IllegalStateException('Element not found!')}

Вариант 2

Я надеваюНе думаю, что это здорово, но вы можете вызвать throw из замыкания и использовать оператор elvis ?:

def sampleList = [1, 2]
def element = sampleList.find{it==3} ?: {throw new IllegalStateException('Element not found!')}()
//Alternately: ...{throw new IllegalStateException('Element not found!')}.call() to make it more readable

:

Exception thrown

java.lang.IllegalStateException: Element not found!
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at ConsoleScript20$_run_closure2.doCall(ConsoleScript20:2)
    at ConsoleScript20$_run_closure2.doCall(ConsoleScript20)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at ConsoleScript20.run(ConsoleScript20:2)
    at jdk.internal.reflect.GeneratedMethodAccessor218.invoke(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

в Groovy консоли

Опция 3 Другая опция - извлечение всей логики в именованное замыкание:

def sampleList = [1, 2]
def tester = {list, value -> if(value in list){value} else{throw new IllegalStateException('Element not found!')}}

tester(sampleList, 3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...