2016-11-25 36 views
5

Tôi đã cố gắng thay đổi mã này thành luồng Java 8. Mã của tôi trông giống như sau:Chuyển đổi bằng cách sử dụng JAVA 8 Luồng

for(D d : n.getD()) { 
    for(M m : d.getT().getM()) { 
     if(m.getAC().contains(this)) { 
      return d; 
     } 
    } 
} 

và tôi muốn chuyển đổi nó thành java 8 luồng. Tôi đã bắt đầu như thế này:

n.getD().stream() 
     .map(m -> m.getT().getM()) 

nhưng sau đó tôi không biết nếu tôi nên đồ lại, hoặc sử dụng một bộ lọc .

+0

Vì bạn có danh sách các danh sách, bạn có thể cần bản đồ phẳng (xem ví dụ: http://www.adam-bien.com/roller/abien/entry/java_8_flatmap_example) và sau đó lọc – zm0

+0

@ zm0 Không thể, vì những gì được trả về là 'd' và không phải' m'. –

Trả lời

2

một cách để xử lý này:

return n.getD().stream().filter(d -> d.getT().getM().stream().filter(m -> m.getAC().contains(this)).findFirst().isPresent()).findFirst(); 

trong trường hợp này một giá trị null là có thể.

+0

Bạn có thể gọi 'isPresent' trên kết quả' filter() 'không? 'filter() trả về luồng ' không phải là một 'Tùy chọn'. Vì vậy, nó phải là 'anyMatch (m -> m.getAC(). Chứa (this))' thay vì 'filter (...). IsPresent()' –

+5

Thực sự. 'anyMatch (predicate)' thích hợp hơn 'bộ lọc (biến vị ngữ) .findFirst(). isPresent()'. Và nếu bạn sử dụng tìm, hãy sử dụng 'findAny (…)' bất cứ khi nào nó không quan trọng để tìm * đầu tiên *. – Holger

4

cách khác có thể là sử dụng anyMatch thay vì thứ hai filter

return n.getD().stream().filter(
    d -> d.getT().getM().stream().anyMatch(
     m -> m.getAC().contains(this) 
    ) 
).findFirst(); // result will be Optional<D> 
1

Tôi không biết về tên miền của bạn, nhưng để giữ cho nó có thể đọc được tôi có lẽ sẽ ủy thác và đơn giản hóa đến một cái gì đó như thế này:

return n.getD().stream() 
       .filter(d -> d.getT().containsAC(this)) 
       .findFirst() 
       .orElse(null); 

Và sau đó trong lớp T thêm phương pháp đoàn:

public boolean containsAC(AC ac) { 
    return m.stream().anyMatch(m -> m.getAC().contains(ac)); 
} 
Các vấn đề liên quan