Lambda表达式

一、Lambda表达式

1)函数式接口

函数式接口(Functional Interface)是只包含一个方法的抽象接口。

比如Java标准库中的java.lang.Runnable,java.util.concurrent.Callable就是典型的函数式接口。

在Java 8中通过@FunctionalInterface注解,将一个接口标注为函数式接口,该接口只能包含一个抽象方法。

函数式接口是为Java 8中的lambda而设计的,lambda表达式的方法体其实就是函数接口的实现。简化匿名内部类

2)lambda表达式

“lambda表达式”是一段可以传递的代码,因为他可以被执行一次或多次。其语法结构如下:

(parameters) -> expression 或者 (parameters) -> {statements;}

括号里的参数可以省略其类型,编译器会根据上下文来推导参数的类型,你也可以显式地指定参数类型,如果没有参数,括号内可以为空。方法体,如果有多行功能语句用大括号括起来,如果只有一行功能语句则可以省略大括号。)

例子:

public class J8test {
 
        //根据名字长度倒序排序,原来要new一个匿名内部类来比较
    @Test
    public void test1() {
        List<String> names = Arrays.asList("lucy","Mia","Isabella","Jackson");
        names.sort(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o2.length()-o1.length();
            }
        });
        names.stream().forEach(str -> System.out.println(str));
    }
     
    //使用lambda表达式后
    @Test
    public void test2() {
        List<String> names = Arrays.asList("lucy","Mia","Isabella","Jackson");
        names.sort((s1,s2)->s2.length()-s1.length());
        names.stream().forEach(str -> System.out.println(str));
    }
}
public class J8test  {
     
    public static void main(String[] args) {
 
        //启动一个新线程
        new Thread(new Runnable() {
            @Override
            public void run() {
                for(int i=0;i<10;i++) {
                    System.out.println("111");
                }
                 
            }
        }, "线程1").start();
         
        //用lambda表达式启动一个新线程
        new Thread(()-> {
            for(int i=0;i<10;i++) {
                System.out.println("111");
            }
        }) .start();
    }
}

3)方法引用

方法引用是lambda表达式的一种简写形式。 如果lambda表达式只是调用一个特定的已经存在的方法,则可以使用方法引用。

使用"::"操作符将方法名和对象或类的名字分隔开来

有四种情况:

对象::实例方法、类::静态方法、类::实例方法、类::new

public class J8test  {
     
    @Test
    public void test3() {
        List<String> names = Arrays.asList("lucy","Mia","Isa","Jackson");
        //names.sort((s1,s2)->s1.compareToIgnoreCase(s2));
        names.sort(String::compareToIgnoreCase);//等价上面一行代码
        names.stream().forEach(str -> System.out.println(str));
    }
     
}
原文地址:https://www.cnblogs.com/jnba/p/10563099.html