5
\$\begingroup\$

I have written a function that returns me the duplicates of a list:

static List<SomeClass> findDuplicateElements(List<SomeClass> myObjects) {
    List<SomeClass> duplicates = myObjects
    .groupBy { it.someAttribute }
    .findAll { it.value.size() > 1 }
    .collect { it.value }
    .flatten()

    assert duplicates.size() != 1
    duplicates
}

The list cannot have the size 1 because if no duplicates are found it must be empty else if there are duplicates it must me at least 2 elements.

Without that check I would do it this way without having to create any new variables:

static List<SomeClass> findDuplicateElements(List<SomeClass> myObjects) {
    myObjects
    .groupBy { it.someAttribute }
    .findAll { it.value.size() > 1 }
    .collect { it.value }
    .flatten()
}

When using assert, is there any way to avoid saving the result in the duplicates variable and returning it at the end?

\$\endgroup\$

1 Answer 1

2
\$\begingroup\$

You can use with to do things inline without declaring another variable:

List list = [
  [first: "foo", last: "bar"],
  [first: "baz", last: "qux"],
  [first: "baz", last: "bar"]
]

List findDuplicateElements(myObjects) {
   myObjects
   .groupBy { it.last }
   .findAll { it.value.size() > 1 }
   .collect { it.value }
   .flatten()
   .with {
     assert it.size() != null
     it
   }
}

assert findDuplicateElements(list).size() == 2
\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.