Part 2 in a Series.
Iterables.getOnlyElement makes sure your collection or iterable contains exactly one element, and returns that. If it contains 0 or 2+ elements, it throws a RuntimeException. This comes up often in unit tests:
Before:
public void testWorkSchedule() {
workSchedule.scheduleUserOnDuty(jesse, mondayAt430pm, mondayAt1130pm);
Set<User> usersOnDuty = workSchedule.getUsersOnDuty(mondayAt800pm);
_assertEquals(1, usersOnDuty.size());_
_assertEquals(jesse, usersOnDuty.iterator().next());_
}`</pre>
### After:
<pre class="prettyprint">` public void testWorkSchedule() {
workSchedule.scheduleUserOnDuty(jesse, mondayAt430pm, mondayAt1130pm);
Set<User> usersOnDuty = workSchedule.getUsersOnDuty(mondayAt800pm);
_assertEquals(jesse, Iterables.getOnlyElement(usersOnDuty));_
}
Iterables.getOnlyElement() describes intent more directly than Set.iterator().next()
and List.get(0)
. As a special treat, there's an overloaded version to use if your Iterable might be empty.