Lambda表达式

文章介绍了Lambda表达式的基本概念,包括作为单一方法接口的实现、使用场景和简化方式。通过示例展示了如何用Lambda替换匿名内部类,并提到了@FunctionalInterface注解的作用,确保接口只包含一个抽象方法。此外,还讨论了Lambda表达式的参数简化和单语句返回值的优化形式。
摘要由CSDN通过智能技术生成

一、啥是Lambda表达式呢?

package com.example.lambda;

public interface A {
    void show1();
    void show2(int i, int j);
}
package com.example.lambda;

/**
 * @Author moon
 * @Date 2023/4/12 14:33
 * @Description TODO
 */
public class B {
    public static void main(String[] args) {
        method(new A() {
            @Override
            public void show1() {
                System.out.println("匿名内部类show1");
            }

            @Override
            public void show2(int i, int j) {
                System.out.println("匿名内部类show2");
                System.out.println("i = " + i + ",j = " + j);
            }
        });

    }
    public static void method(A a) {
        a.show2(1, 2);
    }
}

如果接口里面只有一个方法呢?

package com.example.lambda;

public interface A {
    void show2(int i, int j);
}
package com.example.lambda;

/**
 * @Author moon
 * @Date 2023/4/12 14:33
 * @Description TODO
 */
public class B {
    public static void main(String[] args) {
        method(new A() {
            @Override
            public void show2(int i, int j) {
                System.out.println("匿名内部类show2");
                System.out.println("i = " + i + ",j = " + j);
            }
        });
    }
    public static void method(A a) {
        a.show2(1, 2);
    }
}

二、Lambda表达式使用场景:

Java方法:

权限修饰符 + 返回值 + 方法签名 + 参数声明 + 方法体

Lambda表达式:

参数声明 + 方法体

package com.example.lambda;

/**
 * @Author moon
 * @Date 2023/4/12 14:33
 * @Description TODO
 */
public class B {
    public static void main(String[] args) {
        //Java方法
        method(new A() {
            @Override
            public void show2(int i, int j) {
                System.out.println("匿名内部类show2");
                System.out.println("i = " + i + ",j = " + j);
            }
        });
        //Lambda
        method((int i, int j)->{
            System.out.println("匿名内部类show2");
            System.out.println("i = " + i + ",j = " + j);
        });
    }
    public static void method(A a) {
        a.show2(1, 2);
    }
}

三、说说一个注解,@FunctionalInterface

@FunctionalInterface

检查该接口是不是只有一个抽象方法的。如果是的话,他才不会报错。

就大胆的写Lambda来代替匿名内部类吧!

四、Lambda的具体使用方式:

package com.example.lambda;

/**
 * @Author moon
 * @Date 2023/4/12 14:33
 * @Description TODO
 */
public class B {
    public static void main(String[] args) {
        //匿名内部类
        A aa = new A() {
            @Override
            public void show2(int i, int j) {
                System.out.println("匿名内部类show2");
                System.out.println("i = " + i + ",j = " + j);
            }
        };
        //Lambda
        A a = (int i, int j)->{
            System.out.println("匿名内部类show2");
            System.out.println("i = " + i + ",j = " + j);
        };
        
        method(aa);
        method(a);
    }
    public static void method(A a) {
        a.show2(1, 2);
    }
}

Lambda表达式有返回值的写法

package com.example.lambda;


public interface C {
    boolean a(Object obj);
}

class D {
    C c = new C() {
        @Override
        public boolean a(Object obj) {
            //运算符是双目运算符,
            // 左面的操作元是一个对象实例,右面是一个类.
            // 当左面的对象是右面的类创建的对象时,该运算符运算的结果是true,否则是false
            return (obj instanceof Iterable) && ((Integer) obj < 100);
        }
    };

    C c2 = (Object obj) -> {
        return (obj instanceof Iterable) && ((Integer) obj < 100);
    };
}
package com.example.lambda;


import java.util.ArrayList;

public interface C {
    boolean a(Object obj);
}

class D {
    public static void main(String[] args) {

        //Lambda
        C c = (Object obj) -> {
            return ((obj instanceof  Integer) && (Integer) obj > 100);
        };

        //用到了匿名内部类的构造代码块回调
        ArrayList<Integer> list = new ArrayList<Integer>(){{
            this.add(12);
            this.add(103);
            this.add(87);
            this.add(106);
            this.add(348);
            this.add(64);
        }};

        for (Integer integer : list) {
            if (c.a(integer)) {
                System.out.println("符合规范:\t" + integer);
            }
        }
    }
}
package com.example.lambda;

public interface D1 {
    Object mapping(Object obj);
}

class Main{
    public static void main(String[] args) {
        D1 d = (Object obj) -> {
            return obj.toString();
        };

        D1 d2 = (Object obj) -> {
            return ((obj instanceof String) ? obj + "\tis a String" : null);
        };

        Object mapping = d.mapping(new Main());
        System.out.println(mapping);
    }
}
package com.example.lambda;

import java.util.ArrayList;
import java.util.HashMap;

public interface D1 {
    Object mapping(Object obj);
}

class Main{
    public static void main(String[] args) {
        D1 d = (Object obj) -> {
            return obj.toString();
        };

        D1 d2 = (Object obj) -> {
            return ((obj instanceof String) ? obj + "\tis a String" : null);
        };

        ArrayList<Object> list = new ArrayList<Object>() {{
            this.add(new HashMap());
            this.add(new Main());
            this.add("asdfgh");
        }};

        for (Object obj : list) {
            System.out.println(d2.mapping(obj));
        }
    }
}

五、Lambda的简化方式:

//1、首先第一种情况:Lambda入参类型简化
package com.example.lambda;

public interface E {
    void test(int i, boolean b, String s);
}

class Main1 {
    public static void main(String[] args) {

        //原始
        E e = (int i, boolean b, String s) -> {
            System.out.println(".............");
        };

        //简化
        E e1 = (i, b, s) -> {
            System.out.println(".............");
        };

        //可以乱写名字,java会自动匹配
        E e2 = (ifwfw, bgthgyt, shyhyw) -> {
            System.out.println(".............");
        };

    }
}
//2、第二种情况,Lambda单入参的简写
package com.example.lambda;

public interface E {
    void test(int i);
}

class Main1 {
    public static void main(String[] args) {

        //原始
        E e = (int i) -> {
            System.out.println(".............");
        };

        //简化
        E e1 = (i) -> {
            System.out.println(".............");
        };

        //这种写法新手还不熟悉的最好别学,等你Lambda用熟悉了再写这种也可以。否则新手容易记混什么时候要加()什么时候可以不加()。
        E e2 = i -> {
            System.out.println(".............");
        };

    }
}
//第三种情况,无返回值单语句简化
package com.example.lambda;

public interface E {
    void test(int i);
}

class Main1 {
    public static void main(String[] args) {

        //原始
        E e = (int i) -> {
            System.out.println(i);
        };

        //简化
        E e1 = (i) -> System.out.println(i);

        //简
        E e2 = i -> System.out.println(i);

        //最简
        E e3 = System.out::println;
    }
}
//第四种情况,有返回值单return的简化
package com.example.lambda;

public interface E {
    boolean test(int i);
}

class Main1 {
    public static void main(String[] args) {

        //原始
        E e = (int i) -> {
            return i < 50;
        };
        
        //简
        E e2 = i -> i < 50;
    }
}

参考知乎作者StevenZhang:JDK8新特性第一篇:Lambda表达式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值