美文网首页
Java lambda表达式

Java lambda表达式

作者: 快给我饭吃 | 来源:发表于2019-07-10 08:19 被阅读0次

Java8于2014年发布,其最重要的新特性,便是支持了lambda表达式。那么,什么是lambda表达式呢?我的理解是,lambda表达式是一个匿名函数,可以赋值给一个变量。其他语言如JavaScript非强类型的可以直接赋值,但是,java中一切皆对象,赋给的值需要是“函数式接口”类型(Java8注解@FunctionalInterface标记的接口,只有一个抽象方法的接口),当然,普通的接口类型也可以,lambda充当接口的实现类,如下图Runnable接口。Java8还提供了很多函数式接口方便我们开发,在java.util.function包中。

Runnable接口

更多关于lambda表达是,可以参考本篇文章底部的“参考资料”,可以先看下Mingqi在知乎上的回答,Lambda 表达式有何用处?如何使用? - Mingqi的回答 - 知乎,以下是我的个人总结。总之,java中lambda表达式虽然使得代码相当精简,不过可读性不高,后期很难维护,个人不建议项目中使用lambda表达式。

lambda表达式最规范的形态是(parameters) ->{ statements; },其可以赋值给一个接口,如MyInterface i = (String s, Interger i) -> { Sysout.out.println(s + " " + i); }。当然,参数类型可以省略。同时如果parameters只有一个参数,可以省略小括号,statements只有一条语句,可以省略花括号。如x -> System.out.println(x)

lambda常用模式

OK,接下来试试lambda的用法。首先,我们说lambda需要赋值给接口类型,那么这里,我们定义一个接口,只有一个方法printAString()打印一个字符串。

public interface MyInterface {

    void printAString (String s);
}
MyInterface

有了接口,一般我们需要新建一个实现类才能使用该接口,现在不用啦,用lambda搞定,如下,测试接口的实现。

import me.zebin.demo.lambdademo.service.MyInterface;
import org.junit.Test;

public class MyInterfaceTest {

    @Test
    public void testPrintAString(){
        MyInterface i = x -> System.out.println(x);
        i.printAString("hello lambda");
    }
}

顺利执行。


执行成功 lambda

嗯,在这里可以看到lambda的方便之处了吧,不用新建实现类就能通过lambda定义实现来调用方法了。
如果我们在接口新增一个方法呢,是否可行,如下,lambda报错了,因为lambda的接口只能有一个方法。

接口新增方法
报错

为了防止协同开发过程中,其他人在lambda接口中新增了方法导致别人的报错。可以在接口上加@FunctionalInterface,如下@FunctionalInterface只能有一个方法,否则编译器会报错。


FunctionalInterface
有了lambda,我们以后先线程就不用匿名内部类了,因为Runnable接口也是一个FunctionalInterface。

forEach循环

java的集合类,都实现了Iterable接口,该接口中定义了forEach方法,故结合类基本都能使用该方法。如下,该方法接受一个Consumer类型的接口,并执行他的accept方法。Consumer是一个java.util.function中的@FunctionalInterface接口。

Interable
假设我们定义了一个List中有一组Person,遍历输出这些Person的姓名,那么可以使用lambda表达式如下执行。
Person类如下:
public class Person {

    private String name;

    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

forEach打印测试如下:

public class PersonTest {

    @Test
    public void testPerson(){

        // 构造一个list
        List<Person> l = new ArrayList<>();
        l.add(new Person("zhangsan", 20));
        l.add(new Person("lisi", 21));

        // foreach 循环打印
        l.forEach(x -> System.out.println(x.getName()));
    }
}

运行结果如下:


运行结果如下

本篇就写到这里啦,早上起来写的,上班去。

参考资料

Lambda 表达式有何用处?如何使用? - Mingqi的回答 - 知乎
The Java™ Tutorials(官方文档)
猴子小皮球的简书

相关文章

  • Java 8 - Lambda表达式

    Java 8 - Lambda表达式 1 Java 8-概述2 Java 8 - Lambda表达式3 Java ...

  • 【Java】4.0 Java中lambda表达式(下)

    【Java】3.0 Java中lambda表达式(上)【Java】4.0 Java中lambda表达式(下) 7....

  • java 8 lambda表达式中的异常处理

    java 8 lambda表达式中的异常处理 简介 java 8中引入了lambda表达式,lambda表达式可以...

  • java8

    1.lambda表达式《java8 Lambda表达式简介》 《java8 lambda表达式,方法的引用以及构造...

  • 《Java 8实战》学习总结

    Java 8新特性概览 Lambda表达式 流 默认方法 Lambda表达式 Lambda和函数式接口Java 8...

  • Java零基础自学DAY10 2018-03-22

    Java 8 新增的lambda表达式 Lambda 转换: Lambda表达式组成: 形参列表 箭头 ( ->)...

  • Java 8、9 语言新特性

    Java语言新特性 Java8 Java 8 新特性 Lambda 表达式 Lambda表达式(也叫做闭包)是Ja...

  • Java的Lambda表达式

    Java的Lambda表达式 1. 什么是Lambda表达式 简单的说,Lambda表达式就是匿名方法。Lambd...

  • Lambda表达式

    Lambda表达式与函数式接口紧密相关,函数式接口介绍 Lambda表达式的基本语法 Java Lambda表达式...

  • 7 Lambda表达式

    Lambda表达式是Java8的重要更新,Lambda表达式支持将代码块作为方法参数,Lambda表达式允...

网友评论

      本文标题:Java lambda表达式

      本文链接:https://www.haomeiwen.com/subject/joezqctx.html