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

Java8 Lambda表达式详解及实例

程序员文章站 2024-03-12 17:47:38
第一个lambda表达式 在lambda出现之前,如果我们需要写一个多线程可能需要下面这种方式: runnable runnable = new runna...

第一个lambda表达式

在lambda出现之前,如果我们需要写一个多线程可能需要下面这种方式:

runnable runnable = new runnable() {
      @override
      public void run() {
        system.out.println("hello runnable");
      }
    };
    ...
 thread.start();

上面的例子如果改成使用lambda就会简单许多:

runnable noargs = ()->system.out.println("hello lambda!~");
...
 thread.start();

lambda表达式是一个匿名函数,将行为像数据一样传递,表达式使用 -> 将参数和主体分开, -> 前面是参数部分,后面这是主体部分。

lambda的其它形式

binaryoperator<long> add = (x,y)->x+y;
 //or
 binaryoperator<long> add = (long x,long y)->x+y;
 //or
 binaryoperator<long> add = (long x,long y)->{
  x+y;
 };
  1. lambda表达式使用 () 表示没有参数。
  2. 如果lambda表达式中只包含一个参数,可省略掉 () 。
  3. 如果lambda表达式的主题是一段代码块,需要使用 {} ,该代码块与普通的java代码块并无区别,也可以返回或抛出异常。
  4. 如果参数的类型可以由编译器推断得出可以省略参数类型,当然你也可以加上。

以上就是lambda表达式的所有形式了。

那么问题来了:

binaryoperator<long> add = (long x,long y)->x+y; 是个什么意思?

这行代码并不是讲个数字相加,而是创建了一个函数,用来计算两个数字相加的结果。而add的类型是 binaryoperator<long> ,它也不是两个数字的和,而是将两个数字相加的那段代码。下面的例子展示如何使用这个变量:

binaryoperator<long> add = (long x,long y)->x+y;
 long res = add.apply(3l, 4l);
 system.out.println("res="+res);//输出:res=7

函数接口

函数接口是只有一个抽象方法的接口,用作lambda表达式的类型。

如 runnable 就是一个函数接口。

新建一个我们自己的函数接口:

public interface addoperator<t,d> {
  long add(t one,d two);
}

使用:

addoperator<long,long> addoperator = ( x, y)->x +y;
 system.err.println("custom function listener res= "+addoperator.add(34l, 65l));

目标类型

目标类型是指lambda表达式所在上下文环境的类型。比如,将lambda表达式赋值给一个局部变量,或传递给一个方法作为参数,局部变量或方法参数的类型就是lambda表达式的目标类型。

final

       如果我们在匿名内部类中引用了所在方法中的局部变量,这是需要局部变量是 final 的。

在lambda中我们不需要将引用的外部局部变量声明为 final 的,但是该变量只能被赋值一次。

下面的例子中如果我们去掉注释,对name再次赋值,则无法通过编译,并显示出错信息: local variables referenced from a lambda expression must be final or effectively final.

lambda表达式引用的局部变量必须是final或即成事实的final。

string name = getusername();
//name="hi";
button.addactionlistener(event->system.out.println("name="+name));

类型推断

lambda表达式的类型推断是java7中就引入的目标类型推断的扩展。

java7中的类型推断:

list<string> list= new arraylist<>();

上例中我们并没有指定arraylist的范型类型,而是根据list的类型,推断出了arraylist的范性类型。

如: addoperator<long,long> addoperator = ( x, y)->x +y;

通过此文,希望能帮助到大家,学习理解,此部分知识,谢谢大家对本站的支持!