2017-11-26 30 views
15

tôi đã tìm thấy đoạn mã sau:Streams trong Java, không thể tìm ra mã này

Function<Integer, Predicate<Integer>> smallerThan = x -> y -> y < x; 
List<Integer> l = Arrays.asList(5, 6, 7, 23, 4, 5645, 
    6, 1223, 44453, 60182, 2836, 23993, 1); 

List<Integer> list2 = l.stream() 
    .filter(smallerThan.apply(l.get(0))) 
    .collect(Collectors.toList()); 

System.out.println(list2); 

Như ra tôi nhận được:

[4, 1] 

như thế nào smallerThan hàm trong ví dụ này công việc, xem xét rằng chúng tôi chỉ vượt qua một tham số smallerThan.apply(l.get(0))?

+8

'smallThan' là hàm trả về hàm. –

+5

Bạn có thể viết lại 'smallThan' như sau:' x -> (y -> (y jrook

+3

Xem [Currying] (https://en.wikipedia.org/wiki/Currying). –

Trả lời

19

smallerThan là một Function chấp nhận một đơn Integer và trả về một Predicate<Integer> (một Predicate<Integer> là một chức năng chấp nhận một đơn Integer và trả về một boolean).

smallerThan.apply(l.get(0)) trả về một Predicate<Integer> trông như thế này:

y -> y < l.get(0) 

tức là nó trả về true nếu đầu vào được truyền cho nó nhỏ hơn l.get(0).

Khi bạn vượt qua điều đó Predicate đến filter, đường ống Stream của bạn chỉ giữ các phần tử nhỏ hơn l.get(0).

đường ống của bạn có thể được viết lại như sau:

List<Integer> list2 = l.stream() 
    .filter(y -> y < l.get(0)) 
    .collect(Collectors.toList()); 

Kể từ l.get(0)5, đường ống của bạn trả về tất cả các yếu tố của danh sách ban đầu nhỏ hơn 5.

8

Hàm smallerThan chấp nhận một số và trả về đối tượng Predicate, trong trường hợp này, chúng tôi áp dụng vị từ này cho mọi thành phần của luồng.

Vì vậy, l.get(0) sẽ lấy giá trị đầu tiên của danh sách l đó là (5), sau đó chúng tôi vượt qua nó để smallerThan chức năng và hàm này trả về một vị với tiêu chí y -> y < x; mà đọc như "được đưa ra một con số, trả về true nếu nó nhỏ hơn 5 " do đó đầu ra là [4, 1]

13

Điều đó được gọi là" currying "và nó có thể trước Java 8 qua các lớp ẩn danh chẳng hạn, nhưng nó tiết hơn nhiều. Cuối cùng, đó là một Function trả về một Function và trong khi không phải là lây lan trong Java (chưa), trong các ngôn ngữ chức năng khác nó được sử dụng khá nhiều.

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