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<T> andThen(Consumer<? super T> after)
對給定的參數T執行定義的操作執行再繼續執行after定義的操作
下面對上述方法進行實例測試:
accept(T t)
比如將給定的一批用戶里面的名稱為"lisi"的用戶都給打包起來
List<Person> lisiList = new ArrayList<>();
Consumer <Person> consumer = x -> {
if (x.name.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<T> andThen(Consumer<? super T> after)
比如將給定的一批用戶里面的名稱為"lisi"且年齡大于22歲的用戶都給打包起來
List<Person> lisiList = new ArrayList<>();
Consumer <Person> consumer = x -> {
if (x.name.equals("lisi")){
lisiList.add(x);
}
};
consumer = consumer.andThen(
x -> lisiList.removeIf(y -> y.age < 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<T>相關的接口
-
BiConsumer<T, U>
處理一個兩個參數
-
DoubleConsumer
處理一個double類型的參數
-
IntConsumer
處理一個int類型的參數
-
LongConsumer
處理一個long類型的參數
-
ObjIntConsumer<T>
處理兩個兩個參數,且第二個參數必須為int類型
-
ObjLongConsumer<T>
處理兩個兩個參數,且第二個參數必須為long類型