Lambda表达式详细使用方法

1.使用场景

如果匿名内部类是一个接口,并且当中只有一个抽象方法需要重写,可以使用Lambda表达式。

2.Lambda表达式格式

(参考列表) -> {代码}
先写匿名内部类,然后通过alt+回车进行修改

3.在IDEA中lambda与匿名内部类的转化

lambda转成匿名内部类:
在这里插入图片描述
匿名内部类转成lambda:
在这里插入图片描述

4.例题

4.1

public void test(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("峰哥升仙");
            }
        }).start();

        new Thread(() ->{System.out.println("峰哥升仙");}).start();
    }

4.2

public static int Feng(IntBinaryOperator binaryOperator){
        int a=10;
        int b=20;
        return binaryOperator.applyAsInt(a,b);
    }

    @Test
    public void test1(){
        int feng = Feng((left, right) -> {
            return left + right;
        });
        System.out.println(feng);
    }

4.3

public static void Guo(IntPredicate predicate){
        int arr[]={1,2,3,4,5,6};
        for (int i : arr) {
            if(predicate.test(i)){
                System.out.println(i);
            }
        }
    }

    @Test
    public void test2(){
        Guo((int value) -> {
            return value%2==0;
        });
    }

4.4

public static <R> R type(Function<String,R> stringRFunction){
        String str="12345";
        R apply = stringRFunction.apply(str);
        return apply;
    }

    @Test
    public void test3(){
        Object type = type((String s) -> {
            return s;
        });
        System.out.println(type);
    }

4.5

public  static  void forecahArr(IntConsumer intConsumer){
        int arr[]={1,2,3,4,5,6,7,8,9,10};
        for (int i : arr) {
            intConsumer.accept(i);
        }
    }

    @Test
    public void test4(){
        forecahArr((int value) -> {
            value+=3;
            System.out.println(value);
        });
    }

5.省略规则

1.参数类型可以直接省略
2.方法体只有一句代码时,大括号return和唯一一句代码的分号可以省略
3.方法只有一个参数时小括号可以省略
4.以上这些规则记不住可以省略不记

双冒号::(JAVA8特性的一种)

双冒号:: 写法,这被称为“方法引用”,而双冒号是一种新的语法
方法引用写法: System.out::println
在这里插入图片描述
其中:
什么是函数式接口
所谓的函数式接口,当然首先是一个接口,然后就是在这个接口里面只能有一个抽象方法。

这种类型的接口也称为SAM接口,即Single Abstract Method interfaces。
@FunctionalInterface 仅对抽象方法检查。是函数式接口

1、该注解只能标记在"有且仅有一个抽象方法"的接口上。
2、JDK8接口中的静态方法和默认方法,都不算是抽象方法。
3、接口默认继承java.lang.Object,所以如果接口显示声明覆盖了Object中方法,那么 也不算抽象方法。


版权声明:本文为qq_48581332原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。