特質
消費者模式,接收1個或多個參數,進行邏輯處理,無返回值。
測試
測試數據
@Data
public static class Foo {
String strVal = "Hello";
int intVal = 1;
Double doubleVal = 2.0;
Long longVal = 3L;
Boolean trueVal = true;
String strTmp;
int intTmp = 1;
Double doubleTmp;
Long longTmp;
}
萬能型Consumer
可以指定類型,最常用。
Consumer<String> consumer = foo::setStrTmp;
consumer.accept(foo.strVal);
assertEquals(foo.strVal, foo.strTmp);
固定類型Consumer
提供了已經確定類型的Consumer,使用時不需要再指定泛型類型
DoubleConsumer doubleConsumer = foo::setDoubleTmp;
doubleConsumer.accept(foo.doubleVal);
assertEquals(foo.doubleVal, foo.doubleTmp);
IntConsumer intConsumer = foo::setIntTmp;
intConsumer.accept(foo.intVal);
assertEquals(foo.intVal, foo.intTmp);
LongConsumer longConsumer = foo::setLongTmp;
longConsumer.accept(foo.longVal);
assertEquals(foo.intVal, foo.intTmp);
萬能型數據操作Consumer
可以傳入2個參數,進行數據操作。
BiConsumer<String, String> biConsumer = (left, right) -> foo.strTmp = left + " " + right;
biConsumer.accept("Hello", "BiConsumer");
assertEquals("Hello BiConsumer", foo.strTmp);
固定類型操作Consumer
同樣允許傳入2個參數,不需要額外指定類型,需要注意的是,類型傳入順序和對應consumer命名保持一致。
ObjDoubleConsumer<Foo> objDoubleConsumer = (left, right) -> foo.strTmp = left.strVal + " " + right;
objDoubleConsumer.accept(foo, 1.23);
assertEquals(foo.strVal + " 1.23", foo.strTmp);
ObjIntConsumer<Foo> objIntConsumer = (left, right) -> foo.intTmp = left.intVal + right;
objIntConsumer.accept(foo,2);
assertEquals(3, foo.intTmp);
ObjLongConsumer<Foo> objLongConsumer = (left, right) -> foo.longTmp = left.longVal + right;
objLongConsumer.accept(foo,2L);
assertEquals(5, foo.longTmp.longValue());