Java 8 - 使用Consumer和Thhen

时间:2017-11-23 07:14:07

标签: java java-8

我在POC下面使用Java 8功能。

我想在接受方法后更新数据库。与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;
  }
 }

请帮助一些示例或用例来使用此方法

2 个答案:

答案 0 :(得分:6)

当您想要链接两个andThen的逻辑时,可以使用Consumerconsumer1.andThen(consumer2)首先调用accept的{​​{1}}方法,然后调用consumer1的{​​{1}}方法。

覆盖accept的默认实现没有多大意义,并且阻止您使用lambda表达式/方法引用。

consumer2可用于链接两个andThen s:

andThen

当然,在这个例子中,您可以简单地将两个Consumer的逻辑放在一个traders.forEach(((Consumer<Trader>)(trader -> trader.updateBonus(2))).andThen(trader -> System.out.println("some more processing"))); 中:

Consumer

当您链接两个现有Consumer时使用traders.forEach(trader -> {trader.updateBonus(2); System.out.println("some more processing");}); 更有意义:

andThen

答案 1 :(得分:3)

简而言之,然后用于连锁消费者,因此输入将转到第一和第二消费者,请点击下面:

        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));

所以在这里,交易者将被传递到consumer1,然后传递给consumer2,依此类推。

您不必实现此方法,也不必覆盖它。对于消费者,只实施accept

andThen方法是加入消费者的辅助工具。而不是在循环中将输入传递给所有这些。