package com.levelup.java.guava; import static org.hamcrest.collection.IsIterableContainingInOrder.contains; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.util.List; import org.hamcrest.collection.IsIterableContainingInAnyOrder; import org.junit.Test; import com.google.common.base.CharMatcher; import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.base.Splitter; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Maps; /** * This java example will demonstrate common use cases * for Google guava Iterables utility. * * @author Justin Musgrove * @see <a href='http://www.leveluplunch.com/java/examples/guava-iterables-example/'>Iterables example</a> */ public class IterablesExample { /** * Filter by class type */ @Test public void filter_elements_by_type () { List<Object> randomObjects = Lists.newArrayList(); randomObjects.add(new Integer(15)); randomObjects.add(new Double(12)); randomObjects.add("hello"); randomObjects.add(Lists.newArrayList()); randomObjects.add(Maps.newConcurrentMap()); randomObjects.add("world"); Iterable<String> strings = Iterables.filter(randomObjects, String.class); assertThat(strings, IsIterableContainingInAnyOrder. <String>containsInAnyOrder("hello", "world")); } /** * Combine two iterables */ @Test public void concat_two_iterables () { List<String> list1 = Lists.newArrayList("one"); List<String> list2 = Lists.newArrayList("two"); Iterable<String> oneAndTwo = Iterables.concat(list1, list2); assertThat(oneAndTwo, IsIterableContainingInAnyOrder. <String>containsInAnyOrder("one", "two")); } /** * Find element */ @Test public void find_element_in_iterable () { List <Integer> numbers = Lists.newArrayList( new Integer(1), new Integer(2), new Integer(3)); Integer value = Iterables.find(numbers, new Predicate<Integer> () { public boolean apply(Integer number) { return number == 3 ; } }); assertEquals(new Integer(3), value); } /** * First non null */ @Test public void find_first_non_null () { List<String> strings = Lists.newArrayList( null, "Little", null, "Drummer", "Boy"); String firstNonNull = Iterables.find(strings, Predicates.notNull()); assertEquals("Little", firstNonNull); } /** * Frequency of objects */ @Test public void frequency_of_object_in_iterable () { String jingleChorus = "Oh, jingle bells, jingle bells " + "Jingle all the way " + "Oh, what fun it is to ride " + "In a one horse open sleigh " + "Jingle bells, jingle bells " + "Jingle all the way " + "Oh, what fun it is to ride " + "In a one horse open sleigh"; List<String> words = Splitter.on(CharMatcher.anyOf(" .")) .trimResults(CharMatcher.is('.')) .omitEmptyStrings() .splitToList(jingleChorus.toLowerCase()); int numberOfOccurences = Iterables.frequency(words, "jingle"); assertEquals(6, numberOfOccurences); } /** * First element */ @Test public void get_first_element_in_list () { List<String> strings = Lists.newArrayList("one", "two", "three"); String firstElement = Iterables.getFirst(strings, null); assertEquals("one", firstElement); } /** * Last element */ @Test public void get_last_element_in_iterable () { List<String> strings = Lists.newArrayList("one", "two", "three"); String firstElement = Iterables.getLast(strings, null); assertEquals("three", firstElement); } /** * All elements */ @Test public void iterable_contains_all () { List<String> cookies = Lists.newArrayList( "Peanut Butter Cookies", "Oatmeal-Raisin Cookies", "Basic Chocolate Chip Cookies"); boolean containsCookie = Iterables.all(cookies, new Predicate<String>() { public boolean apply(String input) { return input.toLowerCase().contains("cookie"); } }); assertTrue(containsCookie); } /** * Any element in iterable */ @Test public void iterable_contains_any () { List<String> cookies = Lists.newArrayList( "Peanut Butter", "Oatmeal-Raisin", "Basic Chocolate Chip Cookies"); boolean containsCookie = Iterables.any(cookies, new Predicate<String>() { public boolean apply(String input) { return input.toLowerCase().contains("cookie"); } }); assertTrue(containsCookie); } /** * Number of elements in iterable */ @Test public void iterables_size () { List<Integer> randomNumbers = Lists.newArrayList( new Integer(23), new Integer(33), new Integer(44)); int iterableSize = Iterables.size(randomNumbers); assertEquals(3, iterableSize); } /** * Get element at specified position */ @Test public void get_iterable_element_by_index () { String baconIpsum = "Bacon ipsum dolor sit " + "amet tri-tip rump shoulder " + "kielbasa strip steak"; Iterable<String> chars = Splitter.on(CharMatcher.WHITESPACE) .split(baconIpsum); String elementAtPos5 = Iterables.get(chars, 5); assertEquals("tri-tip", elementAtPos5); } /** * Tranform elements in iterable */ @Test public void tranform_elements_in_iterable () { List<String> numbersAsStrings = Lists.newArrayList( "1", "2", "3"); Iterable<Double> doubles = Iterables.transform(numbersAsStrings, new Function<String, Double>() { @Override public Double apply(String input) { return new Double(input); } }); assertThat(doubles, contains( new Double(1), new Double(2), new Double(3))); } }