2016-11-17 5 views
1

Я новичок в Java 8 lambdas. У меня код начинается с: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:"-) 

и

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

Можно ли это сделать с помощью Java 8 lambdas?

+2

Вы спрашиваете, можете ли вы отличить поведение строковой логики 'String' на основе * имени * вашей переменной переменной Iterable? Это было бы неважно. – Mena

+0

Вы можете передать строку, список и лямбду для добавления в качестве параметров. – SLaks

+0

Я не понимаю ваш вопрос. Можете ли вы привести пример того, как вы хотели бы использовать эти лямбды? – 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

Отлично! Как насчет эффекта эффективности вызова метода применения функции? – 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

Смежные вопросы