Java-JDK8之后的Lambda表达式

Lambda表达式是java jdk8之后的一个新特性,最直观的作用是可以使得代码简洁,使用最多的就是接口的实现这一块,可以操作数组,集合等,尤其是在集合的遍历和其他集合操作过程中,可以极大优化代码的结构。接下来我就直接介绍Lambda的语法再简单的写一个入门案例,旨在复习一天所学内容,可以更好的理解函数式编程,以及对接口实现的方法有更加深刻地认识!

Lambda介绍

首先,我们可以思考一个问题,我们是否可以将一个代码块例如

public void doSomeShit(String s){
	System.out.println(s);
}

赋值给一个变量?
在jdk8之前是做不到的,但是在jdk8之后,Java引入了Lambda表达式之后就可以实现了

aBlockCode=public void doSomeShit(String s){
	System.out.println(s);
}

当我们把一个代码块赋值给一个变量之后,我们就会思考,这个变量是什么类型的?
答案是:接口类型,Lambda表达式也可以这样说,Lambda表达式本身就是一个接口的实现
我们实现接口有两个方法,一个是implement 接口,另一个方法就是new 接口,通过匿名内部类来实现,现在我们又可以通过Lambda表达式来实现接口
但是,我们如果使用Lambda表达式实现接口时,我们对这个接口是有要求的,它规定接口中只能有一个需要被实现的方法,但是并不是规定接口中只有一个方法(因为在jdk8之后加入了default,被default修饰的方法会有默认实现,不是必须被实现的方法,所以不影响Lambda表达式的使用。)

Lambda表达式的语法和使用

Lambda表达式的语法形式为()->{}
()中写实现方法中所需要的参数,{}中写方法体 ->为运算符不可以省略,()和{}遇到一个参数和一个执行语句的时候可以简化不写
下面是一些测试代码

package lambda;

/**
 * 无返回值,无参数
 */
@FunctionalInterface
interface noRetrunNoParam{
    void method();
}

/**
 * 无返回值,有一个参数
 */
@FunctionalInterface
interface noRetrunOneParam{
    void method(int a);
}

/**
 * 无返回值,有多个参数
 */
@FunctionalInterface
interface noRetrunMultiParam{
    void method(int a,int b);
}
/**
 * 有返回值,无参数
 */
@FunctionalInterface
interface RetrunNoParam{
    String  method();
}
/**
 * 有返回值,有一个参数
 */
@FunctionalInterface
interface RetrunOneParam{
    String method(String str);
}

/**
 * 有返回值,有多个参数
 */
@FunctionalInterface
interface RetrunMultiParam{
    String method(String str1,String str2);
}
public class Test {
    public static void main(String[] args) {
        noRetrunNoParam n1=()->{
            System.out.println("noRetrunNoParam");
        };
        n1.method();
        noRetrunOneParam n2=(a)->{
            System.out.println(a);
        };
        n2.method(2);
        noRetrunMultiParam n3=(int a,int b)->{
            System.out.println(a+b);
        };
        n3.method(3,2);
        RetrunNoParam n4=()->{
            return "你好";
        };
        System.out.println(n4.method());
        RetrunOneParam n5=(str)->{
            return "你好"+str;
        };
        System.out.println(n5.method("张三"));
        RetrunMultiParam n6=(String str1,String str2)->{
            return str1+str2;
        };
        System.out.println(n6.method("你好","北京"));
    }
}

Lambda表达式创建线程

package lambda;

public class LambdaThread {
    public static void main(String[] args) {
        System.out.println(Thread.currentThread().getName()+"开始");
        Thread thread=new Thread(()->{
            for (int i=0;i<20;i++){
                System.out.println(Thread.currentThread().getName());
            }
        },"LambdaThread");
        thread.start();
        System.out.println(Thread.currentThread().getName()+"结束");
    }
}

Lambda表达式操作集合

package lambda;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;

class ConsumerImpl implements Consumer{

    @Override
    public void accept(Object o) {
        System.out.println(o);
    }
}
public class ListLambda {
    public static void main(String[] args) {
        List<String > list=new ArrayList<>();
        list.add("a");
        list.add("d");
        list.add("b");
        list.add("c");
        //使用lambda表达式进行接口的实现来遍历集合
        list.forEach(System.out::println);
        //使用lambda表达式进行接口的实现来删除集合中某个元素
        list.removeIf(ele->ele.equals("a"));
        list.forEach(System.out::println);
        //使用lambda表达式进行接口的实现来对集合中的元素进行排序
        list.sort((o1,o2)->o1.compareTo(o2));
        list.forEach(System.out::println);
    }
}

上一篇:win10环境下 jdk8安装点击下一步没反应解决办法


下一篇:call和apply