【问题标题】:Java 8: pass method reference to another methodJava 8:将方法引用传递给另一个方法
【发布时间】:2014-09-08 15:22:05
【问题描述】:

我让自己熟悉 Java 8 所谓的method references

两个问题:

1) 我想打印大写的值。如何将String::toUpperCase 的结果传递给println?例如这段代码不能编译:

List<String> food = Arrays.asList("apple", "banana", "mango", "orange", "ice");
food.forEach(System.out.println(String::toUpperCase));

2) 有没有类似于匿名函数参数(_)的东西,比如 Scala?

【问题讨论】:

  • “方法引用的结果”是什么意思? println 是一个 void 方法,所以显然你不能将它的结果传递给 forEach
  • 我想打印大写的值。所以我想将 toUpperCase 与 println 结合起来
  • “很高兴”在没有解释的情况下投票否决。

标签: java java-8


【解决方案1】:

你要做的是将一个函数与一个消费者结合起来。

你可以这样做:

food.stream().map(String::toUpperCase).forEach(System.out::println);

您也可以使用 lambda 表达式:

food.forEach(x->System.out.println(x.toUpperCase()));

除了这些直截了当的方法之外,您还可以结合 函数 来创建一个新函数,但不能使用消费者创建一个函数,但是,您可以使用以下古怪的代码来做到这一点:

Function<String,String>     f0=String::toUpperCase;
food.forEach(f0.andThen(" "::concat).andThen(System.out::append)::apply);

如果您尝试将第一个表达式内联为单线,这会变得更加丑陋……

【讨论】:

  • Stream如何组合任意操作的方式。
  • 好吧,_ is a reserved keyword 并且可能是您不想在未来的 Java 版本中使用的参数的占位符,但是,这里不适用,因为这里的参数 are 使用过。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-13
  • 1970-01-01
  • 2016-12-21
相关资源
最近更新 更多