Lambda表达式(Java)

1.Lambda表达式

Lambda是一个匿名函数,我们可以将Lambda表达式理解为一段可以传递的代码(将代码像数据一样传递)。

"->"(Lambda操作符)左边:Lambda表达式的所有参数。右边:Lambda体,Lambda需要执行的功能。

java 复制代码
public class MyRunnable implements Runnable{
    @Override
    public void run() {
        System.out.println("这是一个实现Runnable接口的子线程!");
    }
}
public class Test {
    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable();
        //等价于
        Runnable runnable = new Runnable(){
            @Override
            public void run() {
                System.out.println("这是一个实现Runnable接口的子线程!");
            }
        };
        //等价于
        Runnable runnable1 = ()-> System.out.println
                    ("这是一个实现Runnable接口的子线程!");

        Thread thread = new Thread(myRunnable);
        thread.start();
        //等价于
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("这是一个实现Runnable接口的子线程!");
            }
        }).start();
        //等价于
        new Thread(() -> System.out.println
                   ("这是一个实现Runnable接口的子线程!")).start();


    }

1.无参、无返回值

java 复制代码
public interface Www {
    public abstract void print1();//无参、无返回值
}

public class WwwTest {
    public static void main(String[] args) {
        Www www1 = new Www() {
            @Override
            public void print1() {
                System.out.println("无参、无返回值");
            }
        };
        Www www2 = ()-> {System.out.println("无参、无返回值")};
        //等价于 当Lambda体只有一条语句的时候,return和{}可以省略掉
        Www www3 = ()-> System.out.println("无参、无返回值");

        //以上三种方法相当于创建一个类实现了Www接口。
        //当运行方法时,要使用对象名.print();
    }
}

2.无参、有返回值

java 复制代码
public interface Www {
    public abstract String print2();//无参、有返回值
    //public abstract String print3(String name);//有参、有返回值
    //public abstract String print4(String name,int i);//有多个参、有返回值
}

package lambda;

public class WwwTest {
    public static void main(String[] args) {
        Www www1 = new Www() {
            @Override
            public String print2() {
                return "无参、有返回值";
            }
        Www www2 = ()-> "无参、有返回值";
        //等价于
        Www www3 = ()->{ return  "无参、有返回值";};
        //以上三种方法相当于创建一个类实现了Www接口。
        //当运行方法时,要使用对象名.print();
    }
}

3.有参、有返回值

java 复制代码
public interface Www {
   public abstract String print3(String name);//有参、有返回值
}

public class WwwTest {
    public static void main(String[] args) {
        Www www1 = new Www() {

            @Override
            public String print3(String name) {
                System.out.println(name);
                return "有参、有返回值";
            }

        Www www2 = (name)->{
            System.out.println(name);
            return "有参、有返回值";
        };
        //等价于  只有一个参数时,可以省略()
        Www www3 = name->{
            System.out.println(name);
            return "有参、有返回值";
        };
    }
}

4.有多个参、有返回值

java 复制代码
public interface Www {
   public abstract String print4(String name,int i);//有多个参、有返回值
}

public class WwwTest {
    public static void main(String[] args) {
        Www www1 = new Www() {
            @Override
            public String print4(String name, int i) {
                System.out.println(name+i);
                return "有多个参、有返回值";
            }
        };
        Www www2 = (name, i) -> {
            System.out.println(name+i);
            return "有多个参、有返回值";
        };
    }
}

**5.类型推断:**数据类型可以省略,因为编译器可以推断得出,称为"类型推断"。

java 复制代码
public interface Www {
   public abstract String print4(String name,int i);//有多个参、有返回值
}

public class WwwTest {
    public static void main(String[] args) {
        Www www1 = new Www() {
            @Override
            public String print4(String name, int i) {
                System.out.println(name+i);
                return "有多个参、有返回值";
            }
        };
        Www www2 = (String name,int i) -> {
            System.out.println(name+i);
            return "有多个参、有返回值";
        };

        //等价于
        Www www3 = (name, i) -> {
            System.out.println(name+i);
            return "有多个参、有返回值";
        };
    }
}

2.forEach+Lambda

1.使用forEach和Lambda循环list集合

java 复制代码
public class ArrayList {
    public static void main(String[] args) {
        List<String> list = new java.util.ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        list.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });
        System.out.println("--------------------");
        list.forEach(s -> System.out.println(s));
    }
}

2.使用forEach和Lambda循环map集合

java 复制代码
public class Student {
    private String name;

    public Student(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

public class HashMap1 {
    public static void main(String[] args) {
        Map<String,Student> map = new HashMap<>();
        map.put("a",new Student("张三"));
        map.put("b",new Student("李四"));
        map.put("c",new Student("王五"));
        map.forEach((key,value)-> System.out.println(key+"======"+ value.getName()));

        //使用for增强循环遍历map集合
        System.out.println("=====================");
        Set keys = map.keySet();//返回键的集合
        for (Object key : keys) {
            System.out.println(key+"====="+map.get(key).getName());//get(key)根据键返回值
        }

    }
}

3.函数接口

只包含一个抽象方法的接口,称为函数式接口。并且可以使用lambda表达式来创建该接口的对象,可以在任意函数式接口上使用 @FunctionalInterface 注解,来检测它是否是符合函数式接口。同时javac也会包含一条声明,说明这个接口是否符合函数式接口。

Java中的函数式编程体现就是Lambda表达式,所以函数式接口即可以适用于Lambda使用的接口。

java 复制代码
@FunctionalInterface
public interface Www {
    public abstract void print();
}

public class WwwTest {
    public static void main(String[] args) {
        Www www1 = new Www() {
            @Override
            public void print() {
                System.out.println("aaaa");
            }
        };
        www1.print();
        Www www2 = ()-> System.out.println("aaaa");
        www2.print();

    }
}

当接口中写入两个抽象方法时,会报错。

·

相关推荐
驭渊的小故事4 小时前
MyBatis XML 开发实战:从配置到 CRUD 全解析
xml·java·mybatis
哦虎!9 小时前
【JavaEE】网络初识
java
for_ever_love__9 小时前
MySQL ORDER BY 排序优化:从 Using filesort 到索引有序扫描(含双路 / 单路排序原理)
java·mysql·优化·存储·by·order·filesort
我是人✓10 小时前
Java文件上传三方式对比:从传统到SpringBoot
java·开发语言
欣栀♡10 小时前
JVM 频繁 Full GC 先看日志括号里的 cause,jstat 的 FGC 在 JDK 8 上会骗人
java·jvm
IT研究室10 小时前
最新计算机毕业设计选题推荐-基于spring boot的葡萄酒文化宣传网站-网站-文档指导-Java-springboot
java·spring boot·课程设计
慧都小项10 小时前
MyEclipse 中创建和测试 JAX-RS REST 接口:从项目配置到 REST Explorer
java·restful·myeclipse·jax-rs
Wang's Blog10 小时前
Java 项目实战: 交友项目 - 入门案例:编写 Dubbo 服务提供者
java·dubbo·交友
秋饼11 小时前
Spring AI 2.0 结构化输出企业级实战:从 BeanOutputConverter 源码到生产级解析容错
java·ai·技术分享·后端开发
摇滚侠11 小时前
《计算机是如何工作的:人人都能懂的计算机软硬件工作原理》第 9 章 机器码与汇编语言 阅读笔记 9
java·开发语言·笔记