[英]Java generics - map function to a list
我是Java泛型的新手,並且遇到了這樣一個問題:假設您有自己的List實現,並且想提供一種使用某種映射(功能接口)同時轉換所有元素並收集的機制他們進入一個新列表。
盡管功能接口(在我的情況下為IMapper
)的思想和用法是直截了當的,但我還不太想起執行映射的功能應具有的簽名嗎?
這是一個用例示例,也是我的想法。 不幸的是,它不能正常工作,主要問題是:在這種情況下應如何傳遞第二個V
參數類型?
public interface IMapper<T,V> { V map(T v); }
public class MyList<T> extends ArrayList<T> {
public MyList<V> map(IMapper <T,V> mapper) {
MyList<V> list = new MyList<>();
for(T v : this) {
list.add(mapper.map(v));
}
return list;
}
}
// in main
MyList<Integer> list1 = new MyList<>();
// fill etc..
IMapper<Integer,String> m = (i) -> { return i.toString(); };
// "Change" list
MyList<String> list2 = list1.map(m);
PS:我認為這樣的事情很可能已經在Java中實現了( stream()
以及我猜得出的是什么?),但是它應該對我來說是練習。 任何提示將不勝感激:)
您可以在地圖方法上將通用參數定義為類型參數。 像這樣:
public <V> MyList<V> map(IMapper <T,V> mapper) {
...
}
類型參數可以通過兩種方式定義,分別在類或方法上。 如果是在類上定義的,則可以在整個類中使用它。 如果在方法上定義,則只能在該方法中使用。
在您的情況下,可以在類上定義T
參數,而可以在方法上定義V
參數。
您可以將地圖結果類型添加到函數定義中,如下所示:
class MyList<T> extends ArrayList<T> {
public <V> MyList<V> map(IMapper<T, V> mapper) {
MyList<V> list = new MyList<>();
for (T v : this) {
list.add(mapper.map(v));
}
return list;
}
}
例:
MyList<Integer> number = new MyList<>();
number.add(1);
number.add(2);
number.add(3);
number.map(v -> "#" + v).forEach(System.out::println);
使用Java8流,您可以獲得相同的結果,如下所示:
List<Integer> numberStream = new ArrayList<>();
numberStream.add(1);
numberStream.add(2);
numberStream.add(3);
numberStream.stream().map(v -> "#" + v).forEach(System.out::println);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.