很難解釋這個問題,所以我將用下面的代碼進行解釋。
我想創建方法 applyAll。
applyAll 從 User 類中獲取一個 setter 方法并呼叫一個函式(作為引數傳遞)來設定該方法的值。
問題是:
- User::setLogin 的型別是什么?
- 我怎么能呼叫這個通用方法?
public class UserBuilder {
private List<User> users;
/* ... */
public <T> UserBuilder applyAll(??? method, Function<Integer, T> func) {
for (int index = 0; index < users.size(); index ) {
// I don't know how to call 'method' parameter (which is a method of User class)
users.get(i)[method](func.apply(index));
}
return this;
}
public UserBuilder withLogin(Function<Integer, String> func) {
return applyAll(User::setLogin, func);
}
/* ... */
}
public class User {
private String login;
void setLogin(String login) { this.login = login; }
}
用例示例:
List<User> users = new UserBuilder(10).withLogin((index) -> "user_" index).build();
uj5u.com熱心網友回復:
在這種情況下,User::setLogin可以決議為java.util.function.BiConsumer<User, T>:
public <T> UserBuilder applyAll(BiConsumer<User, T> setter, Function<Integer, T> func) {
for (int i = 0; i < users.size(); i ) {
setter.accept(users.get(i), func.apply(i));
}
return this;
}
uj5u.com熱心網友回復:
此處相關的設定器必須清楚地“獲取”一個型別的引數T(畢竟,這就是您在示例代碼中傳遞給它的引數 - 的結果func.apply(index),它是 T 的一個實體),并且回傳 - 好吧,什么都沒有. 這是一個二傳手。
因此,它是一種java.util.function.Consumer<T>“消耗 Ts”的 - 一種接受 Ts 并且不產生任何結果的方法。為了完全正確,如果 setter 也使用 Ts 的某些超型別(如果您的函式產生整數,并且您的 setter 接受 Numbers - 這沒關系),那也沒關系。所以讓我們做那個Consumer<? super T>。
public <T> UserBuilder applyAll(Consumer<? super T> setter, Function<Integer, T> func) {
...
}
你可以稱之為:
List<String> names = ....;
Function<Integer, String> nameMaker = idx -> names.get(idx);
builder.applyAll(User::setName, nameMaker);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/487535.html
上一篇:使用csv列作為函式引數
下一篇:在R中回圈具有相同后綴的多個變數
