欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java8新特性:Lambda表达式

程序员文章站 2022-04-29 18:04:34
Lambda表达式,案例一:new Thread(() -> System.out.println("thread")); Lambda表达式,案例二:由参数/箭头和主体组成: 之前的代码形式: Comparator byWeight = new Comparator() ......

lambda表达式,案例一:new thread(() -> system.out.println("thread"));

lambda表达式,案例二:由参数/箭头和主体组成:

(apple a1, apple a2)  -> a1.getweight().compareto(a2.getweight());

之前的代码形式:

comparator<apple> byweight = new comparator<apple>() {
  public int compare(apple a1, apple a2) {

    return a1.getweight().compareto(a2.getweight());

  }

}

针对这种情形,我们怎么理解呢?其实很简单,上看一下上述lambda表达式的语法:() -> {}(): 括号就是接口方法的括号,接口方法如果有参数,也需要写参数。只有一个参数时,括号可以省略。-> : 分割左右部分的,没啥好讲的。{} : 要实现的方法体。只有一行代码时,可以不加括号,可以不写return。在控制台打印,不返回任何值(看起来像是返回void)  

函数式接口就是只显式声明一个抽象方法的接口。为保证方法数量不多不少,java8提供了一个专用注解@functionalinterface,这样,当接口中声明的抽象方法多于或少于一个时就会报错。如下图所示:
Java8新特性:Lambda表达式

lambda表达式和函数式接口结合

步骤:

  1. 新建无参函数式接口(先演示无参);
  2. 新建包含属性为函数式接口的类;
  3. 实现函数式接口;
  4. 测试函数式接口的方法;

新建无参函数式接口

@functionalinterface
public interface interfacewithnoparam {
    void run();
}

新建包含属性为函数式接口的类

public class testjava8{

    //匿名内部类
    interfacewithnoparam param1 = new interfacewithnoparam() {
        @override
        public void run() {
            system.out.println("通过匿名内部类实现run()");
        }
    };
    //lambda表达式
            //空括号表示无参
    interfacewithnoparam param = () -> system.out.println("通过lambda表达式实现run()") ;
}

测试函数式接口的方法

@test
public void testintfacewithnoparam() {

    this.param.run();
    this.param1.run();
}

运行结果

Java8新特性:Lambda表达式

其他形式的函数式接口及实现

上述内容实现了无参无返回值的函数接口与实现,当然还有其他形式:

有参无返回值

接口

@functionalinterface
public interface interfacewithparams {
    void run(string s);
}

实现

interfacewithparams params = new interfacewithparams() {
    @override
    public void run(string s) {
        system.out.println("通过" + s + "实现run(string)");
    }
};
interfacewithparams params1 = (string s) -> system.out.println("通过" + s + "实现run(string)");

测试

    this.params.run("匿名类");
    this.params1.run("lambda");

运行

Java8新特性:Lambda表达式

无参有返回值

接口

@functionalinterface
public interface interfaceunvoidwithnoparam {
    string run();
}

实现

interfaceunvoidwithnoparam interfaceunvoidwithnoparam = new interfaceunvoidwithnoparam() {
    @override
    public string run() {
        return "hello world!";
    }
};
interfaceunvoidwithnoparam interfaceunvoidwithnoparam1 = () -> "hello lambda!";

测试

    string s = this.interfaceunvoidwithnoparam.run();
    system.out.println("返回结果是:"+s);
    string s0 = this.interfaceunvoidwithnoparam1.run();
    system.out.println("返回结果是:"+s0);

运行

Java8新特性:Lambda表达式

有参有返回值

接口

@functionalinterface
public interface interfaceunvoidwithparams {
    string run(integer integer);
}

实现

interfaceunvoidwithparams interfacewithparams = new interfaceunvoidwithparams() {
    @override
    public string run(integer integer) {
        return string.valueof(integer);
    }
};
interfaceunvoidwithparams interfacewithparams1 = (integer integer) -> string.valueof(integer);

测试

    string s1 = this.interfacewithparams.run(1);
    system.out.println("您输入的是:"+s1);
    string s2 = this.interfacewithparams1.run(2);
    system.out.println("您输入的是:"+s2);