java可以像python中的函式式工具裡的reduce那樣呼叫嗎?
函式式工具(一) - java可以像python中的函式式工具裡的reduce那樣呼叫嗎?
python 裡這樣寫,在java裡是否也能這樣寫嗎?
reduce(add, range(1, 11))
reduce(max,[11,-25])
能!
首先我們實現reduce這個函式。當然不可能事先全,因為java全處理的話,需要很長的程式碼,我們這裡暫時只舉3個例子。
class ob{
@SuppressWarnings("unchecked")
public static <T> T reduce(Class c , String m , T ... objects ) {
for ( Method tm :c.getDeclaredMethods() ){
if( m.equals(tm.getName() ) ){
if (tm.getParameterTypes().length == 1){
if ( tm.getParameterTypes()[0].isArray() == true){
tm.setAccessible(true);
try {
T [] a = (T[]) new Object[1];
a[0] = (T) Arrays.asList(objects).toArray();
return (T) tm.invoke(null, a);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
if ( objects.length == tm.getParameterTypes().length ){
/*個別引數查詢**/
for (int i = 0 ; i<tm.getParameterTypes().length;i++){
if (tm.getParameterTypes()[i]
.getSimpleName().toLowerCase().equals(
objects[i].getClass().
getSimpleName().toLowerCase() ) )
{
tm.setAccessible(true);
try {
return (T) tm.invoke(null, objects);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
}
return null;
}
}
首先一點,上面的類實現得不是非常完美,會在以後的文章中慢慢地重構和優化他。
因為Math物件中沒有add類,那麼我們自己建立一個MyMath物件。
class myMath{
public static Integer add(Integer[] is){
Integer result = 0;
for (Integer a : is ){
result += a;
}
return result;
}
}
我們建立一個試驗函式吧!!。。激動人心的時刻到了:
List<Integer> x = Arrays.asList(1,2,3,4,5,6,7);
Integer c = (Integer) ob.reduce(myMath.class, "add", x.toArray());
System.out.println(c);
列印的結果為
28
OY! 我們成功了。
那麼我們建立的reduce函式也支援math中的大部分操作:
double b = ob.reduce(Math.class,"max",1.2,3.2);
System.out.println(b);
Double a = ob.reduce(Math.class,"abs",-2.2);
System.out.println(a);
例子程式碼如上。分別會列印出來 3.2和 2.2
這樣看起來我們的java程式是不是更加函式化了呢?當然對於xrange和range很好實現,這裡就不給出現了。
以下是使用range或者xrange的樣例程式碼。
Integer c = (Integer) ob.reduce(myMath.class, "add", range(1,7);
是不是有點函數語言程式設計的味道了?
哈哈
相關文章
- 像跟蹤分散式服務呼叫那樣跟蹤 Go 函式呼叫鏈分散式Go函式
- Python 中的map、reduce函式用法Python函式
- JS中函式內套函式的呼叫JS函式
- Python 擴充之特殊函式(lambda 函式,map 函式,filter 函式,reduce 函式)Python函式Filter
- PostgreSQL函式裡呼叫函式(SETOF + RETURN QUERY)SQL函式
- 為什麼 Go 裡值為 nil 可以呼叫函式?Go函式
- js中的寫出想jquery中的函式一樣呼叫JSjQuery函式
- python內建函式 map/reducePython函式
- js裡函式呼叫的四種模式JS函式模式
- Python筆記|Python3中沒有reduce函式的原因Python筆記函式
- JAVA中的函式介面,你都用過嗎Java函式
- 避免SQL中的函式呼叫SQL函式
- java編寫的介面可以呼叫python嗎JavaPython
- reduce與redux中compose函式Redux函式
- Python巢狀定義函式增強reduce()函式功能Python巢狀函式
- 如何使用函式指標呼叫類中的函式和普通函式函式指標
- C++中函式呼叫的用法C++函式
- [譯] 解析 Go 中的函式呼叫Go函式
- Python: 受限制的 "函式呼叫"Python函式
- JS 中的函式表示式和函式宣告你混淆了嗎?JS函式
- Java的預設建構函式呼叫Java函式
- python之高階函式map,reduce,filter用法Python函式Filter
- JAVA中的Random()函式Javarandom函式
- 外部函式的呼叫函式
- js中在一個函式中引用另一個函式中的函式,可以這麼做JS函式
- js函式 函式自呼叫 返回函式的函式 (閉包)JS函式
- JavaScript的記憶函式真的可以提升效能嗎?JavaScript函式
- Python中將函式作為另一個函式的引數傳入並呼叫Python函式
- VB中呼叫WebService上的函式的方法Web函式
- JavaScript 中匿名函式的遞迴呼叫JavaScript函式遞迴
- 函式呼叫中堆疊的個人理解函式
- C中呼叫Lua函式函式
- C++函式中那些不可以被宣告為虛擬函式的函式C++函式
- 解析python生成器函式的呼叫Python函式
- python有主函式嗎Python函式
- JavaScript裡的函式JavaScript函式
- python是函式式語言嗎Python函式
- python中的join()函式Python函式