Consumer是java8提供的函數式接口之一,意思為消費者,接受參數而不返回值
void accept(T t); default Consumer<T> andThen(Consumer<? super T> after) { Objects.requireNonNull(after); return (T t) -> { accept(t); after.accept(t); }; }
方法示例
package jdk8.consumer; import java.util.function.Consumer; public class ConsumerTest { public static void main(String[] args) { ConsumerTest consumerTest = new ConsumerTest(); consumerTest.arithmetic(8, 9, System.out::println, System.out::println); Consumer<String> consumer = s -> System.out.println(s.toUpperCase()); consumer.accept("hello"); consumerTest.arithmetic1(4, 9, System.out::println, (a) -> a = a + 2); consumerTest.arithmetic1(4, 9, System.out::println, (a) -> System.out.println(a * 2)); // consumerTest.arithmetic1(4, 9, System.out::println, (a) -> a * 2);
} public void arithmetic(int i, int s, Consumer<Integer> consumer, Consumer<Integer> consumer1) { consumer1.accept(i * s); consumer.accept(i + s); } public void arithmetic1(int a, int b, Consumer<Integer> consumer, Consumer<Integer> consumer1) { consumer.andThen(consumer1).accept(a + b); } }
這個是錯誤示例,(a) -> a * 2是編譯不通過的,因為Consumer是沒有返回值的,lambda一行的時候默認帶return
Bad return type in lambda expression: int cannot be converted to void 錯誤信息 意思為返回類型錯誤,無法將int轉為void
andThen是個嵌套方法,可以一直嵌套下去,順序為先執行 accept 后執行參數里的 after.accpet
運行結果
72
17 HELLO 13
13
26
Consumer還有多個其他的接口,具體有以下幾種,在使用函數式接口時,若有提供具體類型的接口,就盡量使用此接口,因為具體的類型指定可以避免裝箱拆箱時所帶來的額外資源消耗
BiConsumer 接收兩個參數
IntConsumer 接收一個int參數
LongConsumer 接收一個long參數
DoubleConsumer 收一個double參數
ObjIntConsumer 接收兩個參數 T,int
ObjLongConsumer 接收兩個參數 T,long
ObjDoubleConsumer 接收兩個參數 T,,double