2014-05-21 12 views
5

Tôi có danh sách và tôi muốn phần tử từ danh sách khớp với vị từ. Tôi đang tìm một phần tử từ danh sách khớp với vị từ đầu tiên, nếu vị từ đầu tiên không trả về true, nó sẽ khớp với vị từ thứ hai.Tìm biến vị ngữ phù hợp và sử dụng iterable.tryFind trả về phần tử từ danh sách trong java

Dưới đây là một ví dụ:

Trường hợp1:

result = iterable.tryFind(List, Predicates.or(predicate1, predicate2)).orNull(); 

Vấn đề với đoạn mã này là nó tìm thấy các yếu tố đầu tiên mà phù hợp với bất kỳ của những vị. Ngay cả khi phần tử thứ hai trong danh sách khớp với biến vị ngữ đầu tiên, trong trường hợp của tôi sẽ được ưu tiên cao hơn. Trong trường hợp này, tôi mong đợi kết quả ở đây là phần tử thứ hai, nhưng lấy phần tử đầu tiên (vì nó là phần tử đầu tiên phù hợp với một trong những vị từ đó).

Trường hợp2:

result = iterable.tryFind(List, Predicates.and(predicate1, predicate2)).orNull(); 

Điều này sẽ rõ ràng là không hiệu quả, nếu vị đầu tiên trả về false.

Trường hợp 3:

result = iterable.tryFind(List, predicate1).orNull(); 

if(result == null) 
result = iterable.tryFind(List, predicate2).orNull(); 

này sẽ làm việc cho tôi, nhưng có vẻ lộn xộn và đánh bại mục đích của lập trình chức năng.

Có cách nào khác để tìm nạp phần tử từ danh sách sẽ hoạt động cho kịch bản của tôi không?

+2

Liệu nó thực sự đánh bại các mục đích chỉ vì bạn có các chi nhánh? Điều gì làm phiền bạn: nhánh, vòng lặp kép, cái gì khác? Bạn có thể nhận kết quả bằng một lần lặp, bằng cách ánh xạ thay vì lọc, vì vậy bạn biết vị từ nào phù hợp, lọc các phần tử không khớp với bất kỳ biến vị ngữ nào và sau đó giảm để giữ kết quả đầu tiên, với ưu tiên cho đối sánh vị từ đầu tiên. Nó thực sự sẽ ít lộn xộn hơn (trong Java)? –

+0

@FrankPavageau: các nhánh đang làm phiền tôi. Tôi hy vọng nó hoạt động mà không cần tách các biến vị ngữ. Cái bạn đang đề xuất sẽ tương tự như thế này, nếu tôi hiểu nó đúng. Tôi đoán đây là cách duy nhất tôi có thể làm cho nó hoạt động. – LifeStartsAtHelloWorld

+1

Tôi không nghĩ rằng "lập trình chức năng" có nghĩa là loại bỏ tất cả luồng điều khiển: một cái gì đó phải làm điều đó tại một số điểm, và khi bạn lọc một bộ sưu tập nó chỉ ẩn trong phương thức, không bị xóa. –

Trả lời

5

Bạn có thể sử dụng Optional.or thay vì Predicate.or để có được những gì bạn muốn:

result = Iterables.tryFind(list, predicate1) 
     .or(Iterables.tryFind(list, predicate2)) 
     .orNull(); 
+2

Vấn đề là 'Iterables.tryFind (list, predicate2)' luôn được đánh giá. Bạn cần '||' từ Javascript hoặc 'hoặc' từ LISP. Trong Java nó chỉ có thể hoạt động nếu 'tryFind' là lười và' Optional' sẽ đánh giá đối số của nó khi cần. – maaartinus

+0

Đây là bất lợi của giải pháp của tôi. 'TryFind' lười biếng có thể được thực hiện với một' Nhà cung cấp', nhưng điều này chỉ hoạt động nếu nó không trả về 'vắng mặt '. – phlogratos

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