java 8 可以传方法么_《JAVA8实战》读书笔记之传递方法和传递lambda

传递方法:

假设 你有一个Apple类,它 有一个getColor方法,还有一个变量inventory保存着一个Apples的列表。你可能想要选出所 有的绿苹果,并返回一个列表。通常我们用筛选(filter)一词来表达这个概念。在Java 8之前, 你可能会写这样一个方法filterGreenApples:

1 public static List filterGreenApples( Listinventory )2 {3 List result = new ArrayList<>(); for( Apple apple : inventory )4 {5 if ("green".equals( apple.getColor() ) )6 {7 result.add( apple );8 }9 }10 return(result);11 }

但是接下来,有人可能想要选出重的苹果,比如超过150克:

public static List filterHeavyApples( Listinventory )

{

List result = new ArrayList<>();for( Apple apple : inventory )

{if ( apple.getWeight() > 150)

{

result.add( apple );

}

}return(result);

}

这 两个方法只有一行不同: if里面高亮的那行条件。

Java 8你可以这样写:

1 public static booleanisGreenApple( Apple apple )2 {3 return("green".equals( apple.getColor() ) );4 }5

6

7 public static booleanisHeavyApple( Apple apple )8 {9 return(apple.getWeight() > 150);10 }11

12

13 public interface Predicate{14 booleantest( T t );15 }16

17 static List filterApples( List inventory, Predicatep )18 {19 List result = new ArrayList<>();20 for( Apple apple : inventory )21 {22 if( p.test( apple ) )23 {24 result.add( apple );25 }26 }27 return(result);28 }

要用它的话,你可以写:

1 filterApples(inventory, Apple::isGreenApple);2 或者3 filterApples(inventory, Apple::isHeavyApple);

注:

什么是谓词? 前 面 的 代 码 传 递 了 方 法 Apple::isGreenApple ( 它 接 受 参 数 Apple 并 返 回 一 个 boolean)给filterApples,后者则希望接受一个Predicate参数。谓词(predicate)它接受一个参数值,并返回true或false。你 在后面会看到, Java 8也会允许你写Function,但用Predicate是更标准的方式,效率也会更高一 点儿,这避免了把boolean封装在Boolean里面

传递 Lambda

把方法作为值来传递显然很有用,但要是为类似于isHeavyApple和isGreenApple这种可能只用一两次的短方法写一堆定义有点儿烦人。不过Java 8也解决了这个问题,它引入了一套新

记法(匿名函数或Lambda),让你可以写

filterApples(inventory, (Apple a) -> "green".equals(a.getColor()) );

或者

filterApples(inventory, (Apple a) -> a.getWeight() > 150 );

甚至

filterApples(inventory, (Apple a) -> a.getWeight() < 80 || "brown".equals(a.getColor()) );

所以,你甚至都不需要为只用一次的方法写定义;代码更干净、更清晰,因为你用不着去找自己到底传递了什么代码。但要是Lambda的长度多于几行(它的行为也不是一目了然)的话,那你还是应该用方法引用来指向一个有描述性名称的方法,而不是使用匿名的Lambda。你应该以代码的清晰度为准绳。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值