[英]Map key value to an object in Java 8 stream
假設我有這段代碼:
Map<String, String> map;
// later on
map.entrySet().stream().map(MyObject::new).collect(Collectors.toList());
我有一個MyObject
Constructor
,它接受兩個String
類型的參數。 我希望能夠做到這一點,但我做不到。 我知道我可以做e -> new MyObject(e.getKey(), e.getValue())
但更喜歡MyObject::new
。
類似的代碼適用於Set<String>
和List<String>
帶有MyObject
類的一個參數構造函數。
使用lambda:
map.entrySet()
.stream()
.map(e -> new MyObject(e.getKey(), e.getValue()))
.collect(Collectors.toList());
否則,使用方法引用的唯一方法是通過創建一個函數:
private static MyObject apply(Map.Entry<String, String> e) {
return new MyObject(e.getKey(), e.getValue());
}
然后做類似的事情:
map.entrySet()
.stream()
.map(Main::apply)
.collect(Collectors.toList());
Main
是包含apply
方法的類。
map.entrySet().stream().map(MyObject::new).collect(Collectors.toList()));
我有一個
MyObject
構造函數,它接受兩個String
類型的參數。 我希望能夠做到這一點,但我做不到。
在map.entrySet().stream().map(...)
,Java期望一個Function
,將一個值映射到另一個值。 一個價值。 從流中,函數接收Map.Entry<String, String>
類型的值,但您的構造函數接受兩個String
參數。 Java不會自動將Map.Entry<String, String>
擴展為一對String
以傳遞給您的構造函數。 你必須手動解包。
class MyObject {
private final String k;
private final String v;
MyObject(String s1, String s2) {
k = s1;
v = s2;
}
MyObject(Map.Entry<String, String> e) {
this(e.getKey(), e.getValue());
}
public String toString() {
return "key: " + k + ' ' + "value: " + v;
}
}
你可以打電話
List<MyObject> myObjectList = map.entrySet().stream().map(MyObject::new).collect(Collectors.toList());
構造函數的問題在於它定義了兩個參數,而Stream#map
所要求的Function#apply
只接受一個參數。
您可以為MyObject
編寫靜態工廠方法
class MyObject {
public static MyObject of(Map.Entry<String, String> e) {
return new MyObject(e.getKey(), e.getValue());
}
}
並參考它
map(MyObject::of)
在你這樣做之前,問問自己一個普通處理鏈中某個漂亮的行是否值得一個新的構造函數或實用方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.