资讯专栏INFORMATION COLUMN

【Java 8实战】第2篇:Lambda表达式

figofuture / 1694人阅读

摘要:表达式允许你直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实例。如何使用接口,比如说如何挑选红色苹果为例说明苹果过滤实现测试测试使用表达式定义苹果过滤规则

什么是Lambda表达式

Lambda表达式可以理解为是一种匿名函数:它没有名称,但有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常的列表。

Lambda表达式语法
(parameters) -> expression
或者
(parameters) -> {statements;}
Lambda有效语法举例

1.布尔表达式

(List list) -> list.isEmpty()

2.创建对象

() -> new Apple("苹果")

3.使用一个对象

(Apple a) -> {System.out.println(a.getName());}

4.比较两个对象

(Apple a,Apple b) -> a.getName().compareTo(b.getName())
那些地方可以使用Lambda 函数式接口

函数式接口就是只定义了一个抽象方法的接口;比如Java中的Comparator、Runnable、Callabel接口。含有多个 Extension Methods 的接口也属于函数式接口。

1.Lambda表达式允许你直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实例。你也可以使用匿名内部类来完成同样的事情,只不过比较麻烦。如下示例:

 public static void main(String[] args) {
        /**
         * 利用Ruunable接口run方法打印数据。一个类,实现Runnable接口,
         * 这个类可以做很多事情,不仅仅只被用于线程,也可以用于其他功能!
         */
       
        /*lambda表达式*/
        Runnable run = () -> System.out.println("hello lambda");
        /*匿名内部类*/
        Runnable run2 = new Runnable() {
            @Override
            public void run() {
                System.out.println("hello inner class");
            }
        };

        process(run);
        process(run2);
    }

    public static void process(Runnable runnable) {
        runnable.run();
    }

通过代码我们可以知道,Lambda表达式的签名要和函数式接口的抽象方法签名一致;

使用函数式接口

在JDK1.8中你会发现,函数式接口都带有@FunctionalInterface注解,表示该接口是函数式接口,如果你用了该注解但接口又不是函数式接口,编译器就会报错。

在JDK1.6中我们常见的函数式接口有ComparatorRunnableCallable等。在JDK1.8的java.util.function包中引入新的函数式接口,我们重点介绍一下泛型式函数接口PredicateConsumerFunction

1. Predicate
接口定义了一个test抽象方法,它的作用就是判断入参的行为和某已知的参数行为是否匹配。除此之外,接口中还有 ```and```、```or```等默认方法。
@FunctionalInterface
public interface Predicate {
    boolean test(T t);
}

如何使用Predicate接口,比如说如何挑选红色苹果为例说明

1.苹果过滤实现

public class FilterApple {

    public static  List filterApple(List lists,
                                          Predicate p) {
        List result = new ArrayList<>();
        for (T t : lists) {
            if (p.test(t)) {
                result.add(t);
            }
        }
        return result;
    }
}

2.测试

/*测试*/
public static void main(String[] args) {
        Apple a = new Apple();
        a.setColor("green");

        Apple b = new Apple();
        b.setColor("red");

        List list = new ArrayList<>();
        list.add(a);
        list.add(b);

        /*使用lambda表达式定义苹果过滤规则*/
        Predicate lambdaPredicate = (Apple apple) -> "red".equals(apple.getColor());
        list = FilterApple.filterApple(list, lambdaPredicate);
        
        System.out.println(list.toString()); //[Apple(color=red, weight=0, area=null)]
    }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/71516.html

相关文章

  • java 8 实战》读书笔记 -三章 Lambda达式

    摘要:利用前面所述的方法,这个例子可以用方法引用改写成下面的样子构造函数引用对于一个现有构造函数,你可以利用它的名称和关键字来创建它的一个引用。 第三章 Lambda表达式 函数式接口 函数式接口就是只定义一个抽象方法的接口,哪怕有很多默认方法,只要接口只定义了一个抽象方法,它就仍然是一个函数式接口。 常用函数式接口 showImg(https://segmentfault.com/img...

    whinc 评论0 收藏0
  • Java8 实战总结

    摘要:一个抽象类可以通过实例变量字段保存一个通用状态,而接口是不能有实例变量的。分组和分区分组多级分组分区是分组的特殊情况由一个谓词返回一个布尔值的函数作为分类函数,它称分区函数。 一、基本概念 两个新特性: 1、函数式编程简化代码复杂度(引入了Lambda表达式) 2、更高效的利用多核CPU 1、基本概念: 1、Lambda基本语法 (parameters) -> expression 对...

    lookSomeone 评论0 收藏0
  • 乐字节-Java8核心特性实战之函数式接口

    摘要:大家好,上一篇小乐给大家讲述了乐字节核心特性表达式,点击回顾。接下来继续核心特性之函数式接口。感谢大家欣赏小乐带来的核心特性之函数式接口,接下来还会更多核心技术讲解,请关注乐字节如需要视频课程,请搜索乐字节腾讯课堂 大家好,上一篇小乐给大家讲述了《乐字节-Java8核心特性-Lambda表达式》,点击回顾。接下来继续:Java8核心特性之函数式接口。 什么时候可以使用Lambda?通常...

    niceforbear 评论0 收藏0
  • Android 进阶

    摘要:理解内存模型对多线程编程无疑是有好处的。干货高级动画高级动画进阶,矢量动画。 这是最好的Android相关原创知识体系(100+篇) 知识体系从2016年开始构建,所有的文章都是围绕着这个知识体系来写,目前共收入了100多篇原创文章,其中有一部分未收入的文章在我的新书《Android进阶之光》中。最重要的是,这个知识体系仍旧在成长中。 Android 下拉刷新库,这一个就够了! 新鲜出...

    DoINsiSt 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<