2016-05-18 17 views
8

Tôi mới dùng Java 8, tôi đã xem qua tài liệu java của người tiêu dùng và nó nói, "Người tiêu dùng dự kiến ​​sẽ hoạt động thông qua các tác dụng phụ." Ai đó có thể giải thích tại sao nó được nói như vậy?Java 8 Người tiêu dùng và các tác dụng phụ

+3

Nếu bạn không quen với lập trình hàm, ngôn ngữ đó sẽ không có ý nghĩa gì đối với bạn. Ý tưởng là các hàm "thuần" chỉ đọc từ đầu vào của chúng, và chỉ ghi vào giá trị trả về của chúng (vì vậy sẽ không có tác dụng phụ - hiệu ứng duy nhất của việc chạy hàm là bạn nhận được giá trị trả về.) một cái gì đó (sửa đổi một cấu trúc dữ liệu, chạy IO, vv), được cho là có tác dụng phụ. Một hàm không có giá trị trả lại tốt hơn có tác dụng phụ, hoặc nếu không nó không làm gì cả. –

Trả lời

4

Theo số Consumer javadoc, người tiêu dùng phải được khai báo bằng phương thức có chữ ký void accept(T). Kết quả là, phương thức không thể trả về một giá trị. Nếu nó không có tác dụng phụ, nó sẽ không có khả năng thực hiện bất kỳ hiệu ứng nào.

+0

Cảm ơn. Tôi có điểm số của bạn. – user6348242

0

Hầu hết các giao diện chức năng chỉ có nghĩa là - chức năng giao diện, có nghĩa là chúng chấp nhận đầu vào, thực hiện một số phép tính và trả về kết quả. Chúng không được sửa đổi bất kỳ trạng thái nào. Consumer là ngoại lệ vì nó không trả về bất kỳ giá trị nào; mục đích của nó là chỉ sửa đổi một số trạng thái.

7

tiêu dùng có phương pháp accept với chữ ký sau

void accept(T t); 

Phương pháp này có t như một đầu vào và không trả lại bất cứ điều gì (void), và do đó bạn không thể quay trở lại bất cứ điều gì từ nó và thay thế phương pháp này gọi với giá trị trả về.

Một ví dụ về tác dụng phụ sẽ trình bày in ấn,

list.stream.foreach(System.out::println); 

foreach mất một người tiêu dùng như một cuộc tranh cãi. Nếu bạn nghĩ về nó, điều hữu ích duy nhất bạn có thể làm với một phương pháp như vậy là thay đổi thế giới (tức là, biến đổi một trạng thái).

Điều ngược lại điều đó sẽ là một pure function, một chức năng mà không đột biến bất cứ tiểu bang, phải mất một đầu vào, và trả về một cái gì đó, ví dụ

Function<Integer,Integer> fn = x -> x*x; 

fn đây không có bất kỳ tác dụng phụ (nó không biến đổi bất cứ điều gì), nó nhận được một số nguyên và trả về một cách hòa bình hình vuông của nó.

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