JDK8日常開發系列:Consumer詳解


java.util.function中 Function, Supplier, Consumer, Predicate和其他函數式接口廣泛用在支持lambda表達式的API中。這些接口有一個抽象方法,會被lambda表達式的定義所覆蓋。

Consumer的作用顧名思義,是給定義一個參數,對其進行(消費)處理,處理的方式可以是任意操作.

@FunctionalInterface
public interface Consumer<T> {

    void accept(T t);

    default Consumer<T> andThen(Consumer<? super T> after) {
        Objects.requireNonNull(after);
        return (T t) -> { accept(t); after.accept(t); };
    }
}

其核心方法如下:

  • void accept(T t);
    對給定的參數T執行定義的操作

  • default Consumer andThen(Consumer<? super T> after)
    對給定的參數T執行定義的操作執行再繼續執行after定義的操作

下面對上述方法進行實例測試:

accept(T t)

比如將給定的一批用戶里面的名稱為"lisi"的用戶都給打包起來

/**
 * 此處使用lombok插件(值得了解)
 */
@Data
@Accessors(chain = true)
@AllArgsConstructor
public class Person {
    private Integer age;
    private String name;
}

List<Person> lisiList = new ArrayList<>();
Consumer<Person> consumer  = x -> {
    if (x.getName().equals("lisi")){
        lisiList.add(x);
    }
};
Stream.of(
        new Person(21,"zhangsan"),
        new Person(22,"lisi"),
        new Person(23,"wangwu"),
        new Person(24,"wangwu"),
        new Person(23,"lisi"),
        new Person(26,"lisi"),
        new Person(26,"zhangsan")
).forEach(consumer);

System.out.println(JSON.toJSONString(lisiList));

結果為:

[{"age":22,"name":"lisi"},{"age":23,"name":"lisi"},{"age":26,"name":"lisi"}]

default Consumer andThen(Consumer<? super T> after)

比如將給定的一批用戶里面的名稱為"lisi"且年齡大於22歲的用戶都給打包起來

List<Person> lisiList = new ArrayList<>();
Consumer<Person> consumer  = x -> {
    if (x.getName().equals("lisi")){
        lisiList.add(x);
    }
};
consumer = consumer.andThen(
        x -> lisiList.removeIf(y -> y.getAge() < 23)
);
Stream.of(
        new Person(21,"zhangsan"),
        new Person(22,"lisi"),
        new Person(23,"wangwu"),
        new Person(24,"wangwu"),
        new Person(23,"lisi"),
        new Person(26,"lisi"),
        new Person(26,"zhangsan")
).forEach(consumer);

System.out.println(JSON.toJSONString(lisiList));
}

結果為:

[{"age":23,"name":"lisi"},{"age":26,"name":"lisi"}]

與Consumer 相關的接口

  • BiConsumer<T, U>

處理一個兩個參數

  • DoubleConsumer

處理一個double類型的參數

  • IntConsumer

處理一個int類型的參數

  • LongConsumer

處理一個long類型的參數

  • ObjIntConsumer

處理兩個參數,且第二個參數必須為int類型

  • ObjLongConsumer

處理兩個參數,且第二個參數必須為long類型

歡迎關注微信公眾號,獲取更多資源

程序員小明


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM