Java(4-3)

来源:互联网 发布:淘宝直播开蚌是真的吗 编辑:程序博客网 时间:2024/06/14 11:30

在4-2中已经知道了如何生成lambda表达式,以及如何把lambda表达式传递到需要一个函数。下面看看如何编写方法处理lambda表达式:

使用lambda表达式的重点在于延迟执行。这可能有很多原因:也许你想多次运行这部分代码,也许是你只想在必要的时候执行这些代码,也许是你想在算法的适当位置运行代码,等等。

我们来看一个例子:假设你想重复一个动作n次。将这个动作和重复次数传递到一个repeat方法:repeat(10,()->System.out.println("Hello,World"));
那如何让这个lambda表达式多次执行呢?这就要用到Java API中提供的最重要的函数式接口。在这里,我们可以用无参数或返回值的动作运行,即Runnable函数式接口。

public static void repeat(int n,Runnable action){    for(int i = 0;i < n; i++)action.run();//注意看啊上头方法名就是repeat}

需要说明,调用action.run()时会执行这个lambda表达式的主体。
你现在可能还不知道,怎么调用这些东西,没关系,往下看。

现在让这个例子更复杂一些。我们希望告诉这个动作他出现在哪一次迭代中。为此,需要选择一个合适的函数式接口,其中要包含一个方法,这个方法要有一个int参数并且返回类型为void。处理int值的标准接口如下:

public interface IntConsumer{    void accept(int value);}

下面给出repeat方法的改进增强需求版本:

public static void repeat(int n,IntConsumer actiopn){    for(int i = 0;i < n;i++)action.accept(i);}

对于上方的例子,现在我们可以说可以如下调用它:repeat(10,i -> System.out.println("Countdown" + (9 - i)));

最好使用《java核心技术:卷一》中 p240 p241 表6-1 或 6-2中的接口。

这里我们再谈一下Comparator:
Comparator接口包含很多方便的静态方法来创建比较器。这些方法可以用于lambda表达式或方法引用。

静态comparing方法取一个“建提取器”函数,它将类型T映射为一个可比较类型(比如String)。对要比较的对象应用这个函数,然后对返回的键完成比较。例如,假设由一个Person对象数组,可以如下按名字对这些对象排序:Arrays.sort(people,Comparator.comparing(Person::getname))

与手动实现一个Compartor相比,是不是容易很多?
别急,还可以把比较器和thenComparing方法串起来。例如,

Arrays.sort(people,Comparator,comparing(Person::getLastName).thenComparing(Person::getFirstName));

这些方法还有很多变体形式。可以为comparing和thenComparing方法体恤的键指定一个比较器。例如,可以如下根据人名展读完成排序

Arrays.sort(people,Comparator.comparing(Person::getName,(s,t)->Integer.compare(s.length(),t.length())));
原创粉丝点击