簡體   English   中英

如何在Java8中將數據從對象集合復制到不同對象的集合

[英]How do I copy data from a collection of objects to a collection of different objects in Java8

我想使用函數式編程將數據從一個對象的集合復制到其他對象的集合。

我一直在閱讀幾本Java 8書籍並在線研究。 我很確定我想使用stream(),但是幾乎我看到的每個示例都總是在一個集合中進行迭代,對集合中的對象進行一些處理,並使用println()輸出內容。 似乎沒有人討論如何處理如下所述的情況。

  1. 假設我們有以下對象:

     public class ObjectA { private String someData; private int moreData; public String getSomeData() { return someData; } public void setSomeData(String sData) { someData = sData; } public int getMoreData() { return moreData; } public void setMoreData(int mData) { moreData = mData; } } public class ObjectB { private String b_Data; public String getB_Data() { return b_Data; } public void setB_Data(String bData) { b_Data = bData; } } 
  2. 我想創建一個ObjectB對象的集合,其b_data屬性等於ObjectAs集合中的someData屬性。

  3. 下面的代碼說明了一種相當不錯的方法:

     public class Collector { public Collection<ObjectB> collectObjects(Collection<ObjectA> theAs) { // The use of an ArrayList is arbitrary. I might want to use any number // of different lists or even different collections! final Collection<ObjectB> theBs = new ArrayList<ObjectB>(); for(ObjectA obj : theAs) { final ObjectB bobj = new ObjectB(); bobj.setB_Data(obj.getSomeData()); theBs.add(bobj); } return theBs; } } 

collectObjects()方法中的代碼可以使用,但是它使用命令式編程技術。 我想知道如何使用功能技術來收集ObjectB。

有沒有一種方法可以使用流和lambda來完成此任務?

實際上,這種情況適用於Stream API。 您想要的是:

  1. 使用theAs.stream()一個Stream<ObjectA> ,它是輸入列表的Stream。
  2. 地圖中的每個ObjectA在流到ObjectBStream.map
  3. 使用Collectors.toList() Stream.collect的結果收集到一個新列表中。

這將是一個實現:

public Collection<ObjectB> collectObjects(Collection<ObjectA> theAs) {
    return theAs.stream().map(obj -> {
        final ObjectB bobj = new ObjectB();
        bobj.setB_Data(obj.getSomeData());
        return bobj;
    }).collect(Collectors.toList());
}

當然,你可以創建一個構造ObjectB是需要obj.getSomeData()作為參數。 這樣可以簡化代碼,因為這樣您可以編寫:

public Collection<ObjectB> collectObjects(Collection<ObjectA> theAs) {
    return theAs.stream().map(obj -> new ObjectB(obj.getSomeData())).collect(Collectors.toList());
}

obj -> new ObjectB(obj.getSomeData())稱為lambda表達式

您可以這樣做:

List<ObjectB> theBs = theAs
    .stream()
    .map(a-> {
        final ObjectB bobj = new ObjectB();
        bobj.setB_Data(a.getSomeData());
        return bobj;
    }).collect(Collectors.toList());

a- a -> { ... }構造是lambda ,該構造使您可以將一些可執行代碼傳遞到方法調用中。

在第二個示例中,lambda的主體直接來自循環主體。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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