[英]How do I write a comparator that compares 2 different fields in a collection of objects?
[英]How do I copy data from a collection of objects to a collection of different objects in Java8
我想使用函數式編程將數據從一個對象的集合復制到其他對象的集合。
我一直在閱讀幾本Java 8書籍並在線研究。 我很確定我想使用stream(),但是幾乎我看到的每個示例都總是在一個集合中進行迭代,對集合中的對象進行一些處理,並使用println()輸出內容。 似乎沒有人討論如何處理如下所述的情況。
假設我們有以下對象:
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; } }
我想創建一個ObjectB對象的集合,其b_data屬性等於ObjectAs集合中的someData屬性。
下面的代碼說明了一種相當不錯的方法:
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。 您想要的是:
theAs.stream()
一個Stream<ObjectA>
,它是輸入列表的Stream。 ObjectA
在流到ObjectB
與Stream.map
。 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.