Eclipse Collections puts iteration methods directly on the container types. Here's several code examples that demonstrate the simple and flexible style of programming with Eclipse Collections.
First, we will define a simple class named Person with a first and last name, getters and a constructor.
public class Person
{
private final String firstName, lastName;
...
public boolean lastNameEquals(String name)
{
return name.equals(this.lastName);
}
}First we will create a MutableList with three instances of the Person class.
MutableList<Person> people = Lists.mutable.with(
new Person("Sally", "Smith"),
new Person("Ted", "Watson"),
new Person("Mary", "Williams"));Then we will collect their last names into a new MutableList, and finally output the names to a comma delimited String using makeString.
MutableList<String> lastNames = people.collect(person -> person.getLastName());
Assert.assertEquals("Smith, Watson, Williams", lastNames.makeString());The lambda in the example above can also be replaced with a method reference.
MutableList<String> lastNames = people.collect(Person::getLastName);Eclipse Collections has support for both Mutable and Immutable collections, and the return types of methods are covariant. Here we use the same Lists factory to create an ImmutableList.
ImmutableList<Person> people = Lists.immutable.with(
new Person("Sally", "Smith"),
new Person("Ted", "Watson"),
new Person("Mary", "Williams"));While the collect method on a MutableList returned a MutableList, the collect method on an ImmutableList will return an ImmutableList.
ImmutableList<String> lastNames = people.collect(Person::getLastName);
Assert.assertEquals("Smith, Watson, Williams", lastNames.makeString());Eclipse Collections has a lazy API as well, which is available by calling the method asLazy. The method collect will now return a LazyIterable. The LazyIterable that is returned does not evaluate anything until the call to a terminal method is made. In this case, the call to makeString will force the LazyIterable to collect the last names.
LazyIterable<String> lastNames = people.asLazy().collect(Person::getLastName);
Assert.assertEquals("Smith, Watson, Williams", lastNames.makeString());We can find all of the people with the last name "Smith" using the method named select.
MutableList<Person> people = Lists.mutable.with(
new Person("Sally", "Smith"),
new Person("Ted", "Watson"),
new Person("Mary", "Williams"));
MutableList<Person> smiths = people.select(person -> person.lastNameEquals("Smith"));
Assert.assertEquals("Smith", smiths.collect(Person::getLastName).makeString());If we want to use a method reference, we can use the method selectWith.
MutableList<Person> smiths = people.selectWith(Person::lastNameEquals, "Smith");
Assert.assertEquals("Smith", smiths.collect(Person::getLastName).makeString());We can find all the people who do not have a last name of "Smith" using the method named reject.
MutableList<Person> notSmiths = people.reject(person -> person.lastNameEquals("Smith"));
Assert.assertEquals("Watson, Williams", notSmiths.collect(Person::getLastName).makeString());If we want to use a method reference, we can use the method rejectWith.
MutableList<Person> notSmiths = people.rejectWith(Person::lastNameEquals, "Smith");
Assert.assertEquals("Watson, Williams", notSmiths.collect(Person::getLastName).makeString());We can test whether any, all or none of the elements of a collection satisfy a given condition.
// Any
Assert.assertTrue(people.anySatisfy(person -> person.lastNameEquals("Smith"));
Assert.assertTrue(people.anySatisfyWith(Person::lastNameEquals, "Smith"));
// All
Assert.assertFalse(people.allSatisfy(person -> person.lastNameEquals("Smith"));
Assert.assertFalse(people.allSatisfyWith(Person::lastNameEquals, "Smith"));
// None
Assert.assertFalse(people.noneSatisfy(person -> person.lastNameEquals("Smith"));
Assert.assertFalse(people.noneSatisfyWith(Person::lastNameEquals, "Smith"));