我在POC下面使用Java 8功能.
我想在接受方法后更新DB.和它一起andThen()好吗?这个方法何时被调用?谁叫它?
andThen()方法的基本用法是什么?看着文档令人困惑.
public class StockTest {
public static void main(String[] args) {
List<Trader> traders = new ArrayList<>();
Random random = new Random();
// Initializing trading a/c's.
for (int i = 0; i < 10; i++) {
Trader trader = new Trader((random.nextInt(100) + 1) * 3);
traders.add(trader);
}
// Display Trade accounts.
System.out.println("Before Bonus, Units are:");
for (Trader trader : traders) {
System.out.print(trader.getUnits() + "\t");
}
// Add bonus to each trader.
traders.forEach(new Consumer<Trader>() {
@Override
public void accept(Trader trader) {
trader.updateBonus(2);
}
@Override
public Consumer<Trader> andThen(Consumer<? super Trader> after)
{
System.out.println("In andThen");
return Consumer.super.andThen(after);
}
});
// Display Trade accounts after bonus applied..
System.out.println("\nAfter bonus:");
for (Trader trader : traders) {
System.out.print(trader.getUnits() + "\t");
}
}
}
class Trader {
private int units;
public Trader(int initialUnits) {
this.units = initialUnits;
}
public int getUnits() {
return units;
}
public void setUnits(int units) {
this.units = units;
}
public void updateBonus(int bonusUnits) {
this.units = this.units * bonusUnits;
}
}
Run Code Online (Sandbox Code Playgroud)
请帮助一些示例或用例来使用此方法
简而言之,andThen 用于链接消费者,因此输入将转到第一和第二消费者,如下所示:
Consumer<Trader> consumer1 = new Consumer<Trader>() {
@Override
public void accept(Trader trader) {
trader.updateBonus(2);
}
};
Consumer<Trader> consumer2 = new Consumer<Trader>() {
@Override
public void accept(Trader trader) {
// do something
}
};
// Add bonus to each trader.
traders.forEach(consumer1.andThen(consumer2));
Run Code Online (Sandbox Code Playgroud)
所以在这里 Trader 将被传递给consumer1,然后传递给consumer2等等。
您不必实现或覆盖此方法。当涉及到消费者时,只实现accept.
andThen方法是加入消费者的辅助工具。而不是在循环中将输入传递给所有这些。
andThen当你想要链接两个Consumers 的逻辑时使用.consumer1.andThen(consumer2)首先调用accept方法consumer1然后调用accept方法consumer2.
覆盖默认实现andThen没有多大意义,并且阻止您使用lambda表达式/方法引用.
andThen可以用来连锁两个Consumers:
traders.forEach(((Consumer<Trader>)(trader -> trader.updateBonus(2))).andThen(trader -> System.out.println("some more processing")));
Run Code Online (Sandbox Code Playgroud)
当然,在这个例子中,您可以简单地将两个Consumers 的逻辑放在一个单独的Consumer:
traders.forEach(trader -> {trader.updateBonus(2);
System.out.println("some more processing");});
Run Code Online (Sandbox Code Playgroud)
andThen当你链接两个现有的Consumers 时使用它更有意义:
Consumer<Trader> traderConsumer1 = trader -> trader.updateBonus(2);
Consumer<Trader> traderConsumer2 = trader -> System.out.println(trader);
traders.forEach(traderConsumer1.andThen(traderConsumer2));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2673 次 |
| 最近记录: |