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();

    }
}

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

·

相关推荐
Theodore_10223 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
冰帝海岸4 小时前
01-spring security认证笔记
java·笔记·spring
世间万物皆对象5 小时前
Spring Boot核心概念:日志管理
java·spring boot·单元测试
没书读了5 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
小二·5 小时前
java基础面试题笔记(基础篇)
java·笔记·python
开心工作室_kaic6 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
懒洋洋大魔王6 小时前
RocketMQ的使⽤
java·rocketmq·java-rocketmq
武子康6 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
转世成为计算机大神6 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
qq_327342737 小时前
Java实现离线身份证号码OCR识别
java·开发语言