Даже при работе со Spock 1.2-groovy-2.4-SNAPSHOT и Groovy 3.0.0-alpha-1 вы не можете напрямую использовать лямбда-код и синтаксис методов Java, я только что протестировал его в своем примере проекта Spock / Geb Maven в IntelliJ IDEA , Но даже со Spock 1.1 и Groovy 2.4.7 довольно просто и элегантно заменить лямбды и ссылки на методы без приведения или as
, насколько я видел в своем быстром тесте:
package de.scrum_master.stackoverflow
import groovy.transform.ToString
import groovy.transform.TupleConstructor
import spock.lang.Specification
class LambdaMethodRefTest extends Specification {
def "Replace lambdas and method references in Groovy"() {
given:
def bookStream = [
new Book("Fortran", "Fred", 1957, 57.99),
new Book("Java in 3 Days", "Alice", 2005, 11.99),
new Book("Java in 4 Days", "Bob", 2005, 22.99),
new Book("Filter-Map-Reduce with Lambdas", "Claire", 2014, 33.99)
].stream()
when:
def mapReduceResult = bookStream
.filter { it.year >= 2004 }
.peek(System.out.&println)
.map { it.author }
.map { it.toUpperCase() }
.peek { System.out.println(it) }
.reduce("", { s1, s2 -> (s1.isEmpty()) ? s2 : s1 + ", " + s2 })
then:
mapReduceResult == "ALICE, BOB, CLAIRE"
}
@TupleConstructor
@ToString(includeNames = true, includePackage = false)
static class Book {
String title, author; int year; double price
}
}
Обратите внимание на два разных способа звонка System.out.println
- на ваш выбор. ; -)
Журнал консоли:
LambdaMethodRefTest$Book(title:Java in 3 Days, author:Alice, year:2005, price:11.99)
ALICE
LambdaMethodRefTest$Book(title:Java in 4 Days, author:Bob, year:2005, price:22.99)
BOB
LambdaMethodRefTest$Book(title:Filter-Map-Reduce with Lambdas, author:Claire, year:2014, price:33.99)
CLAIRE
Что именно вам не хватает?
Обновление: Почему-то мой старый код, использующий .map(String.&toUpperCase)
, больше не работает после того, как я изменил некоторые вещи в своем проекте Maven. Интересно, почему это сработало раньше? Поэтому я обновил пример кода.