2016-05-18 30 views
8

我是Java 8的新手,我遇到了Consumer java文檔,它說:「消費者需要通過副作用來操作。」請有人解釋爲什麼這樣說?Java 8消費者和副作用

+3

如果你不習慣函數式編程,那麼這種語言對你來說並不重要。這個想法是,「純粹」函數只能從它們的輸入中讀取,並且只寫入它們的返回值(所以不會有副作用 - 運行函數的唯一影響是您得到返回值。)函數(修改數據結構,運行IO等),據說有副作用。沒有返回值的函數最好有副作用,否則它沒有做任何事情。 –

回答

4

根據Consumer javadoc,必須用具有簽名void accept(T)的方法聲明消費者。因此,該方法無法返回值。如果它沒有副作用,它將不具備任何效果。

+0

謝謝。我明白了你的觀點。 – user6348242

0

大多數功能接口只是用於接口,它嚴格意味着它們接受輸入,進行一些計算並返回輸出。他們不應該修改任何狀態。 Consumer是例外,因爲它不返回任何值;其目的僅僅是修改某些州。

7

消費者有方法accept具有以下簽名

void accept(T t); 

該方法將T作爲輸入,不返回任何東西(空),因此你不能從它返回任何東西和更換方法用它返回的值調用。

的副作用會打印指令的例子,

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

的foreach需要消費作爲參數。如果你仔細想想,你能用這種方法做的唯一有用的事情就是改變世界(即改變一個狀態)。

的那會一個pure function,即不發生變異的任何狀態的功能,它需要一個輸入,並返回的東西,例如

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

fn這裏沒有任何副作用的相反(它不會改變任何東西),它會收到一個整數並和平地返回它的正方形。