Java 8 Lambdas将函数或变量作为参数传递

Java 8 Lambdas将函数或变量作为参数传递,java,lambda,Java,Lambda,我不熟悉Java8Lambdas。我有一个代码,以: StringBuilder lemma = new StringBuilder("("); 和两段以上的代码。第一个: lemma.append("("); for (String dt : dts) { lemma.append("label1:").append(labelList.getLabel1(dt)).append(OPERATOR); } lemma.delete(lemma.length() - OPERATO

我不熟悉Java8Lambdas。我有一个代码,以:

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(")");
我如何制作一个包含接受参数的两段代码的函数:

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


有可能用Java8Lambdas做这样的事情吗?

您可以这样编写它

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();
 }

使用流式和细木工/收集器。连接(并与Peters接受的答案对齐):


您是否在询问是否可以根据
Iterable
变量引用的名称来区分
String
构建逻辑的行为?那将是一个否。您可以传递字符串、列表和lambda作为参数进行追加。我不理解您的问题。你能举个例子说明你想如何调用这些lambdas吗?另外,虽然使用秘鲁地名很可爱,但它为非秘鲁读者增加了很多认知负担。如果你使用“英语”地名也没有多大帮助:
london。getBristol(mt)
是荒谬的。也许用一些在某些领域有意义的变量名来更新这个问题。我正试图找到一个解决方案,将字符串或函数传递给函数。太好了!调用函数的apply方法对性能的影响如何?@kamaci它与向StringBuilder追加字符串相比非常小。我读了一些关于使用stream map collect会降低性能的内容。这取决于(一如既往)。我读到一些关于流还没有像我们希望的那样在某些情况下快,但在其他一些情况下更快的消息。取决于所执行的操作,以及是否并行(这并不总是有意义的)……所有这些都可能在幕后发生变化(JIT编译器?)。这段代码的性能是否至关重要?真的,真的对性能至关重要吗?如果是这样,您可能想完全省略它?;-)如果性能不是最重要的要求,我会一直追求可读性。如果是,我会为它进行适当的设计。是的,这不是一个性能关键代码:)另一方面,有时使用lambdas是不可读的:)如果它不是真正可读的,那么lambda不是合适的解决方案,或者它使用得不好…:-)如果你的意思是流没有那么可读,你就习惯了;-)
func() (which is for -labelList.getLabel1(dt)- or -mt-)
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);
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())