2016-05-12 38 views
10

Gần đây tôi đã có cơ hội để tinh chỉnh một số mã Java và đã có thể tận dụng lợi thế của một số tính năng Java 8 mới. Trong một trường hợp cụ thể, tôi cần có danh sách các thuộc tính (String) .Name từ một danh sách các đối tượng. Một ví dụ đơn giản về những gì tôi đã làm là: (? Chưa)C# tương đương với Java 8 "phương pháp tham khảo"

// sample data: <Thing> objects have a single String property called "Name" 
List<Thing> thingList = new ArrayList<>(Arrays.asList(new Thing("Thing1"), new Thing("Thing2"))); 

// first pass 
List<String> nameList = new ArrayList<>(); 
thingList.forEach(x -> nameList.add(x.getName())); 

// refinement 1: use stream, map, and collect 
List<String> nameList1 = thingList.stream().map(x -> x.getName()).collect(Collectors.toList()); 

// refinement 2: use "Thing::getName" method reference 
List<String> nameList2 = thingList.stream().map(Thing::getName).collect(Collectors.toList()); 

Tôi đã tò mò để xem cách những cách tiếp cận sẽ dịch C#, và tôi đã nhận

// sample data: <Thing> objects have a single String property called "Name" 
var thingList = new List<Thing> { new Thing("Thing1"), new Thing("Thing2") }; 

// first pass 
var nameList = new List<String>(); 
thingList.ForEach(x => nameList.Add(x.Name)); 

// refinement 1: use Select and ToList 
List<String> nameList1 = thingList.Select(x => x.Name).ToList(); 

Những gì tôi đã không tìm thấy là một C# tương đương với "sàng lọc 2" để thay thế biểu thức Lambda bằng một cái gì đó (một chút) ngắn gọn hơn. Có tương đương C# với tham chiếu phương thức Java 8 "trong trường hợp này hay không, vì tôi đang cố gắng để có được thuộc tính của từng đối tượng (trong Java được thực hiện bằng phương thức getProperty)?

Trả lời

4

Bạn sẽ phải khai báo một phương pháp bên ngoài Thing (hoặc một Thing phương pháp tĩnh), sau đó bạn có thể vượt qua một tài liệu tham khảo phương pháp nhóm với nó:

private string GetName(Thing thing) 
{ 
    return thing.Name; 
} 

... 

List<String> nameList1 = thingList.Select(GetName).ToList(); 

Trong C# 6, bạn cũng có thể sử dụng một chức năng biểu hiện để lưu một vài dòng:

private string GetName(Thing thing) => thing.Name; 
+0

Nhưng đường cú pháp giống như tham chiếu phương thức, về cơ bản nó vẫn là '.Select (x => GetName (x)) '. –

+1

Chắc chắn đó là tham chiếu phương pháp. Nhưng nếu đó là đường thì sao? OP chỉ muốn viết mã ngắn hơn. Có gì khác biệt? – Blorgbeard

+5

@Danny Chen: "về cơ bản" tham chiếu phương thức của Java 8 cũng là cú pháp đường cho biểu thức lambda gọi phương thức được chỉ định. Mặc dù, về mặt kỹ thuật, nó là một cách khác, một biểu thức lambda là cú pháp đường cho một phương pháp tham chiếu đến một phương pháp bổ sung giữ cơ thể của lambda. – Holger

Các vấn đề liên quan