2016-02-02 28 views
2

我想使用函數式編程將數據從一個對象的集合複製到其他對象的集合。如何將數據從對象集合複製到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. 我想創建對象B的對象的集合,其b_data atributes都等於someData ObjectAs的集合屬性。

  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()方法中的代碼將工作,但它使用命令式編程的techniqhes。我想知道如何使用功能性技術來製作ObjectB的集合。

有沒有辦法使用流和lambdas來實現這個?

回答

1

你可以這樣說:

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

a -> { ... }結構是一個拉姆達,構造,可以讓你通過一些可執行的代碼到一個方法調用。

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

3

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

  1. 做一個Stream<ObjectA>這是您的輸入列表的流,與theAs.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 expression

相關問題