2016-11-17 74 views
1

我是Java 8 lambda的新手。我有一個代碼開頭:Java 8 Lambdas Pass函數或變量作爲參數

StringBuilder lemma = new StringBuilder("("); 

和比兩塊代碼。第一招:

lemma.append("("); 

for (String dt : dts) { 
    lemma.append("label1:").append(labelList.getLabel1(dt)).append(OPERATOR); 
} 

lemma.delete(lemma.length() - OPERATOR.length(), lemma.length()); 
lemma.append(")"); 

第二個:

lemma.append("("); 

for (String mt : mts) { 
    lemma.append("label2:").append(mt).append(OPERATOR); 
} 

lemma.delete(lemma.length() - OPERATOR.length(), lemma.length()); 
lemma.append(")"); 

我怎樣才能使其中涵蓋了功能2件代碼接受參數:

List<String> (which is for -dts- or -mts-) 

String (which is for -"label1:"- or -"label2:"-) 

and

func() (which is for -labelList.getLabel1(dt)- or -mt-) 

是否有可能用Java 8 lambda做這樣的事情?

+2

你問你是否可以根據你的'Iterable'變量引用的* name *來區分'String'構建邏輯的行爲嗎?這將是一個不。 – Mena

+0

您可以傳遞字符串,列表和一個lambda作爲參數追加。 – SLaks

+0

我不明白你的問題。你能舉一個你想如何調用這些lambda表達式的例子嗎? – slim

回答

1

你可以把它寫這樣

public static <T> String dump(List<T> list, String desc, Function<T, String> func) { 
    StringBuilder lemma = new StringBuilder(); 
    String sep = "("; 
    for (T t : list) { 
     lemma.append(sep).append(desc).append(func.apply(t)); 
     sep = OPERATOR; 
    } 
    return lemma.length() == 0 ? "()" : lemma.append(")").toString(); 
} 

您可以通過

String a = dump(dts, "cuzco:", huancayo::getCuzco); 
String b = dump(mts, "cucuta:", m -> m); 
+0

太棒了!調用函數的apply方法的性能效果如何? – kamaci

+0

@kamaci與將字符串附加到StringBuilder相比,它相當小 –

0

使用流和StringJoiner/Collectors.joining(和調整彼得斯接受的答案)調用這些:

public static <T> String dump(String label, List<T> list, Function<T, String> func) { 
    return list.stream() 
      .map(s -> label + func.apply(s)) 
      .collect(Collectors.joining(OPERATOR, "(", ")")); 
} 

該呼叫將是相同的:

String a = dump(dts, "label1:", labelList::getLabel1); 
String b = dump(mts, "label2:", m -> m); 
// or: dump(mts, "label2:", Function.identity()) 
+0

我讀了一些關於使用stream-map-collect殺死性能的內容? – kamaci

+0

這取決於(一如既往)。我讀了一些關於流不是那麼快,但我們希望他們在某些情況下,但在其他情況下更快。取決於所執行的操作以及是否平行進行(這並不總是有意義的)......所有這些都可能在封面(JIT編譯器?)下發生變化。這段代碼性能至關重要嗎?真的,性能真的很重要嗎?如果是這樣,你可能想完全省略它? ;-)如果性能不是最重要的要求,我總是會爲了可讀性而去。如果是這樣,我會適當地設計它。 – Roland

+0

是的,這不是一個性能至關重要的代碼:)另一方面,有時它不可讀使用lambdas :) – kamaci