В настоящее время BiFunction
интерфейс имеет два метода andThen()
и apply()
.Я нашел разные примеры в сети, но нижеприведенный пример - это то, что я не могу понять - «Как работает цепочка этих методов»
Пример 1:
BiFunction<String, String,String> bi = (x, y) -> {
return x + y;
};
Function<String,String> f = x-> x+" spinner";
System.out.println(bi.andThen(f).apply("hello", " world"));
Прочитав следующую ссылку ' Метод Default andThen () в интерфейсе BiFunction ', я взял строки ниже
Предположим, у нас было две функции f и g, функция f выполняла некоторыелогика и функция g выполняют некоторый другой тип логики, поэтому, когда вы составляете f.andThen (g), это по существу означает g (f (x)), т.е. мы сначала применяем функцию, заданную в качестве аргумента f (x), а затем применяем функцию g крезультат.
и пришел к выводу, что сначала происходит bi.apply("hello", " world"))
, а затем result
передается bi.andThen(f(result))
, и это дает окончательный результат hello world spinner
.
Я понялв некоторой степени, но не полностью удовлетворены.Я должен был спросить об этом, потому что в прошлом я использовал шаблон построителя, и это что-то вроде ниже,
BankAccount account = new BankAccount.Builder("bank_account")
.withOwner("account_owner")
.atBranch("branch_name")
.openingBalance(balance)
.build();
Здесь, вызов метода происходит в последовательности, сначала класс Builder
(статический) получаетинициализируется, затем withOwner
назначает имя владельца и возвращает компоновщик, а затем присваивается имя ветви и возвращает компоновщик, дается следующий начальный баланс и возвращается компоновщик, и, наконец, сборка возвращает экземпляр BankAccount
.Пожалуйста, смотрите BankAccount
класс.
public class BankAccount {
public static class Builder {
private long accountNumber;
private String owner;
private String branch;
private double balance;
public Builder(long accountNumber) {
this.accountNumber = accountNumber;
}
public Builder withOwner(String owner){
this.owner = owner;
return this;
}
public Builder atBranch(String branch){
this.branch = branch;
return this;
}
public Builder openingBalance(double balance){
this.balance = balance;
return this;
}
public BankAccount build(){
//Here we create the actual bank account object, which is always in a fully initialised state when it's returned.
BankAccount account = new BankAccount(); //Since the builder is in the BankAccount class, we can invoke its private constructor.
account.accountNumber = this.accountNumber;
account.owner = this.owner;
account.branch = this.branch;
account.balance = this.balance;
return account;
}
}
}
Как видите, методы вызываются последовательно и вывод методов - withOwner
, atBranch
, openingBalance
, является экземпляром Builder
в цепочке.и для меня это называется цепочкой методов, потому что выходные данные каждого метода в последовательности используются позже, и это очень ясно.Но я спрашиваю - как работает цепочка методов из приведенного выше примера 1 (BiFunction and its methods chaining)
внутренне .