Consumer是java8提供的函數式介面之一,意思為消費者,接受參數而不返回值 方法示例 這個是錯誤示例,(a) -> a * 2是編譯不通過的,因為Consumer是沒有返回值的,lambda一行的時候預設帶return Bad return type in lambda expression ...
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