3 回答
TA贡献1848条经验 获得超6个赞
为了了解return从该 API 获取的内容,您可以尝试将实现可视化为:
default Consumer<T> andThen(Consumer<? super T> after) {
Objects.requireNonNull(after);
return new Consumer<T>() { // return the complete Consumer implementation
@Override
public void accept(T t) {
Consumer.this.accept(t); // accept current consumer
after.accept(t); // and then accept the 'after' one.
}
};
}
现在把它联系起来
(T t) -> { accept(t); after.accept(t); }
是一个Consumer返回值,它确保accept首先编辑当前的,然后是提到的那个after。
TA贡献1836条经验 获得超5个赞
一个函数式接口必须只有一个抽象方法。但是,它可以有任意数量的静态方法和默认方法。的方法Consumer
有:
accept(T)
这是 的单一抽象方法
Consumer
。它接受类型的单个通用参数T
并且不返回任何内容(即void
)。这是由 lambda 表达式或方法引用实现的方法。andThen(Consumer)
这是默认方法。换句话说,它有一个实现,因此是非抽象的。该方法接受一个
Consumer
并返回另一个Consumer
。因为它是一个默认方法,所以单一的抽象方法Consumer
仍然存在accept(T)
。
上面解释了为什么Consumer
可以有一个方法返回void
. 现在,当谈到 的实现时andThen
,重要的是要意识到实际上涉及三个 Consumer
s:
被调用的实例
andThen
。引用的实例
after
。实例返回给调用者。
如果您对代码进行格式化,那么并非所有内容都在同一行上,这可能更容易理解:
default Consumer<T> andThen(Consumer<? super T> after) {
Objects.requireNonNull(after);
// Returns Consumer instance #3. The lambda is the implementation
// of the 'accept' method.
return (T t) -> {
accept(t); // Invokes 'accept' on Consumer instance #1.
after.accept(t); // Invokes 'accept' on Consumer instance #2.
}
}
TA贡献1818条经验 获得超11个赞
我想我理解你的担忧。您想知道如果返回 voidandThen()
之后为什么可以调用。accept()
accept()
问题是,您首先定义一个Consumer
对象,然后在该实例上调用andThen()
方法。例如:
Consumer<String> consumer = s -> System.out.println(s); consumer.andThen(s -> System.out.println(s.toUpperCase()));
添加回答
举报