Predicates example

Setup

class HTMLElement {

    public HTMLElement(String tagName) {
        super();
        this.tagName = tagName;
    }

    private String tagName;

    @Override
    public String toString() {
        return Objects.toStringHelper(HTMLElement.class)
                .add("tagName", tagName)
                .toString();
    }

    public String getTagName() {
        return tagName;
    }

}

Predicate<HTMLElement> byAnchor = new Predicate<HTMLElement>() {
    public boolean apply(HTMLElement input) {
        return input.getTagName().startsWith("a");
    }
};

Filter collection

@Test
public void filter_collection_with_predicate () {

    List<HTMLElement> htmlElements = Lists.newArrayList(
            new HTMLElement("a:link"),
            new HTMLElement("a:visited"),
            new HTMLElement("a:hover"),
            new HTMLElement("a:active"),
            new HTMLElement("a:focus"),
            new HTMLElement("a:focus:hover"),
            new HTMLElement("p"),
            new HTMLElement("p:first-letter"),
            new HTMLElement("p:first-line")
        );

    Collection<HTMLElement> anchors = Collections2.filter(htmlElements, byAnchor);

    logger.info(anchors);

    assertEquals(6, anchors.size());
}

Output

[
    HTMLElement{tagName=a:link},
    HTMLElement{tagName=a:visited},
    HTMLElement{tagName=a:hover},
    HTMLElement{tagName=a:active},
    HTMLElement{tagName=a:focus},
    HTMLElement{tagName=a:focus:hover}
]

Filter empty or null elements

@Test
public void filter_empty_null_elements() {

    List<String> words = Lists.newArrayList(
            "", null, "do", "not", "cry",
            null, "over", "spilt", "beer");

    Predicate<String> NOT_EMPTY = new Predicate<String>() {
        @Override
        public boolean apply(String arg0) {
            return !arg0.isEmpty();
        }
    };

    Iterable<String> filteredWords =
            Iterables.filter(words,
                    Predicates.
                    and(Predicates.notNull(),
                            NOT_EMPTY));

    logger.info(filteredWords);

    assertThat(filteredWords, IsIterableContainingInOrder.
            <String>contains("do", "not", "cry",
                    "over", "spilt", "beer"));

}

Output

[do, not, cry, over, spilt, beer]

Charmatcher

/**
 * [email protected] CharMatcher} implements predicate but has special syntax.
 */
@Test
public void charmatcher_implements_predicate () {

    String theDigits = CharMatcher
            .DIGIT
            .retainFrom("ACB 132, ABC 123"); // only the digits

    assertEquals("132123", theDigits);
}