将Lambda表达式转换为方法引用

将lambda表达式用作匿名函数,但不对传入的参数进行任何操作,则可以将lambda表达式替换为方法引用。 下面的代码是用方法参考替换lambda的好例子

  1. listOfNumbers.stream().sorted().forEach(number -> {

  2. System.out.println(number);

  3. }

  4. );

由于我们这里没有修改number参数,因此可以替换lambda表达式:

 
  1. number -> {

  2. System.out.println(number);

  3. }

方法参考如下所示:

listOfNumbers.stream().sorted.forEach(System.out::println);

但是,如果您在将参数传递给另一个方法之前修改了该参数,则无法用方法引用替换lambda,例如,在以下情况下,我们无法这样做:

 
  1. listOfNumbers.stream().sorted().forEach(number -> {

  2. System.out.println(String.valueOf(number));

  3. }

  4. );

双冒号(::)运算符用于方法引用,实际上有三种主要用法:

 
  1. object::instanceMethod

  2. Class::staticMethod

  3. Class:instanceMethod

在前两种情况下,方法引用等效于提供方法参数的lambda表达式,例如
System.out :: println等效于
x-> System.out.println(x)和 Math :: pow等效于 (x,y)-> Math.pow(x,y)。

在这种情况下,第一个参数成为方法的目标。 例如,
String :: compareToIgnoreCase与

(x, y) -> x.compareToIgnoreCase(y)

或this :: equals与

(x -> this.equals(x))

您可以阅读有关在Java SE 8中将这种类型的lambda表达式转换为方法参考的更多信息,有关Really Im Patient的内容 ,对此主题有更多的解释和示例。

用方法引用替换lambda表达式的另一个很好的示例是以下代码,该代码在Java 8中按值对映射进行排序

 
  1. Map sortByValue = map.entrySet()

  2. .stream()

  3. .sorted(Map.Entry.<String, Integer>comparingByValue())

  4. .collect(Collectors.toMap(e -> e.getKey(),e -> e.getValue()));

可以使用方法参考重写为以下内容:

 
  1. Map sortByValue = map.entrySet()

  2. .stream()

  3. .sorted(Map.Entry.<String, Integer>comparingByValue())

  4. .collect(toMap(Map.Entry::getKey,

  5. Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));

如果您仔细观察,我们将e-> e.getKey()替换为
Map.Entry :: getKey和e-> g.getValue()到
Map.Entry :: getValue,因为我们已经以getKey()和getValue()方法的形式编写了这些lambda表达式所执行的代码。

这就是何时以及如何用Java 8中的方法引用替换lambda表达式的全部内容。 仅在不进行任何修改的情况下才可以替换,否则就不能替换。 为什么要这么做? 好吧,因为方法引用比lambda表达式更简洁易读。

Java 8的新增功能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值