簡體   English   中英

將鍵值映射到Java 8流中的對象

[英]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以傳遞給您的構造函數。 你必須手動解包。

添加Map.Entry構造函數

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM