无法弄清楚用法

Ara*_*ram 4 lambda java-8

以下是Java SE 8针对Really Impatient的练习之一.

从Collection形成一个子类Collection2,并添加一个默认方法void forEachIf(Consumer action,Predicate filter),它将操作应用于filter返回true的每个元素.你怎么用它?

以下是我的定义Collection2.我无法弄清楚如何使用它.

public interface Collection2<E> extends Collection<E>
{

    default void forEachIf(Consumer<E> action, Predicate<E> filter)
    {
        forEach(e -> {
            if (filter.test(e))
            {
                action.accept(e);
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

所以,我有以下列表,我想对String.toUpperCase以"a"开头的字符串应用操作.我将如何使用它Collection2来实现这一目标?

public static void ex09()
{
        Collection<String> l = new ArrayList<>();
        l.add("abc");
        l.add("zxx");
        l.add("axc");

        // What next???

}
Run Code Online (Sandbox Code Playgroud)

dka*_*zel 6

你需要创建一个实现的新类Collection2,

public class ArrayList2<E> extends ArrayList<E> implements Collection2<E>{

}
Run Code Online (Sandbox Code Playgroud)

然后只使用你的新课程:

public static void ex09()
{
    Collection2<String> l = new ArrayList2<>();
    l.add("abc");
    l.add("zxx");
    l.add("axc");

    l.forEachIf(  (s)->System.out.println(s.toUpperCase()),
                  (s)-> s.startsWith("a"));


}
Run Code Online (Sandbox Code Playgroud)

哪个在运行时会打印:

ABC
AXC
Run Code Online (Sandbox Code Playgroud)