2016-03-25 41 views
17

Tôi chỉ có thể tìm cách làm điều này trong C# chứ không phải Java.Cách sử dụng biểu thức Lambda Java 8 để chuyển đổi Danh sách một loại thành Danh sách loại phụ

Tôi có một số List<TypeX> nhưng tôi biết rằng mọi phần tử trong danh sách đó thực sự là một phân lớp của TypeX Được gọi là TypeY.

Làm cách nào để viết biểu thức Lambda chấp nhận List<TypeX> và trả lại List<TypeY>?

+0

bạn đã thử mọi thứ chưa? – Reimeus

+0

Nếu tôi thành thật thì tôi vẫn chọn cú pháp lambda của Java. –

+0

Bạn đang cố gắng xem cùng một trường hợp theo một cách khác (không an toàn) hoặc tạo danh sách mới như trong 3 câu trả lời (cho đến nay)? –

Trả lời

22

Ví dụ của tôi, tôi sẽ sử dụng các loại sau đây:

class TypeX {} 
class TypeY extends TypeX {} 

Sau đó, tôi có một List<TypeX>:

final List<TypeX> xList = ... 

Tất cả bạn cần làm là sử dụng tài liệu tham khảo một phương pháp để TypeY.class.cast:

final List<TypeY> yList = xList.stream() 
           .map(TypeY.class::cast) 
           .collect(toList()); 

Bạn cũng có thể filter() để loại trừ các mục mà sẽ gây ra một lỗi:

final List<TypeY> yList = xList.stream() 
           .filter(TypeY.class::isInstance) 
           .map(TypeY.class::cast) 
           .collect(toList()); 

Ví dụ sử dụng:

import static java.util.stream.Collectors.toList; 
+5

Tôi sẽ chấp nhận điều này như là câu trả lời đúng vì bộ lọc để loại trừ lỗi, nhưng tôi khuyên bạn nên đề cập đến nhập tĩnh cho người sưu tầm hoặc thay đổi câu trả lời cho Collectors.toList(). –

+0

Cảm ơn câu trả lời này! – dahui

4

Chỉ cần tất cả map với một lambda rằng phôi các yếu tố:

List<TypeX> list = ...; 
List<TypeY> castList = 
    list.stream().map(x -> (TypeY)x).collect(Collectors.toList()); 
5

Chiếu trong Java là được thực hiện bằng phương pháp map:

List<TypeY> res = listTypeX 
    .stream() 
    .map((x) -> (TypeY)x) 
    .collect(Collectors.toList()); 
2

Bạn có thể sử dụng selectInstancesOf() từ Eclipse Collections:

MutableList<TypeX> xList = Lists.mutable.empty(); 
MutableList<TypeY> yList = xList.selectInstancesOf(TypeY.class); 

Nếu bạn không thể thay đổi xList từ List:

List<TypeX> xList = Lists.mutable.empty(); 
List<TypeY> yList = ListAdapter.adapt(xList).selectInstancesOf(TypeY.class); 

Lưu ý: Tôi là một người đóng góp cho Eclipse Bộ sưu tập.

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