一文搞定Java的Lambda表达式

写在前面的话:“在成功的道路上,活力是需要的,志向是可贵的,但更重要的是那毫无情趣的*乎*常的坚守的毅力和勇气。”你好,我是梦阳辰,未来我和你一起成长。

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

Lambda允许把函数作为一个方法的参数(函数作为参数传递到方法中)。
为什么要使用Lambda表达式?
可以写出更简洁的,更灵活的代码。作为一种更紧凑的代码风格,是java的语言表达能力得到了提升。

对比:

import java.util.Comparator;
import java.util.TreeSet;

public class LambdaTest {
    //原来的匿名内部类

    public void test1(){
        Comparator<Integer> com  = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return Integer.compare(o1,o2);
            }
        };
        TreeSet<Integer> ts  = new TreeSet<>(com);
    }

    //Lambda表达式
    public void test2(){
        Comparator<Integer> com  = (x,y) ->Integer.compare(x,y);
        TreeSet<Integer> ts  = new TreeSet<>(com);
    }

}

在这里插入图片描述

3.Lambda表达式的基础语法
Java8中引入了一个新的操作符“->"该操作符称为箭头操作符或Lambda操作符。
箭头操作符将Lambda表达式拆分为两个部分。

左侧:Lambda 表达式列表(接口中方法中的参数列表)。

右侧:表达式中所需执行的功能(接口中实现的代码)。

语法格式:

1.抽象方法,无参,无返回值
() -> System.out.println(“Hello Lambda”);

2.有一个参数,无返回值
(x) ->System.out.println(x);

public void test1(){
Consumer<String> con = (x) -> System.out.println(x);
con.accept("fda");
}

3.有一个参数,小括号可以省略不写。

4.有两个以上的参数,并且Lambda体中,有多条语句,有返回值。
Compatator com = (x,y) ->{
System.out.println(“函数式接口”);
return Integer.compare(x,y);
};

public void test2(){
Compatator<Integer> com = (x,y) ->{
	System.out.println("函数式接口");
	return Integer.compare(x,y);
};
}

5.有两个以上的参数,并且Lambda体中,只有一条语句,return和大括号都可以省略不写。

com = (x,y) -> Integer.compare(x,y);

6.Lambda表达式的参数列表的数据类型可以省略不写,因为JVM编译器可以通过上下文推断。

lambda 表达式只能引用标记了 final 的外层局部变量(final可以省略),这就是说不能在 lambda 内部修改定义在域外的局部变量,否则会编译错误。

Lambda表达式需要函数式接口的支持

函数式接口:接口中只有一个抽象方法的接口,称为函数式接口。

使用注解@FunctionalInterface修饰,可以检查接口是否是函数式接口。

案例1:实现数据运算:


@FunctionalInterface
public interface Myfun {
    public Integer getValue(Integer num);//抽象方法
}


public class Test {
    public static void main(String[] args) {
      Integer num=  operation(100,x->x*x);//乘
      Integer num2=  operation(100,x->{
          int result = x+900;return result;});//乘
        System.out.println(num2);
    }

    /**
     * 对数据进行操作
     * @param num
     * @param mf
     * @return
     */
    public  static Integer operation(Integer num,Myfun mf){
        return  mf.getValue(num);
    }
}

进阶练习:
1.调用Collections.sort()方法,通过定制排序比较两个Employee(先按年龄比,年龄相同
按姓名比),使用Lambda作为参数传递。


import java.util.*;

public class Test {
    public static void main(String[] args) {
        List<Employee> list  = Arrays.asList(
                new Employee("MengYangChen",18,2000),
                new Employee("Meng",21,1000),
                new Employee("MenaYang",21,20000)
        );

       /* Comparator<Employee> a  = new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                return ;
            }
        }*/


       /* Comparator<Employee> e = (x,y)->{
            if(x.getAge()==y.getAge()){
                return x.getName().compareTo(y.getName());
            }
            return Integer.compare(x.getAge(),y.getAge());};*/


        Collections.sort(list,(x,y)->{
            if(x.getAge()==y.getAge()){
                return x.getName().compareTo(y.getName());
            }
            return Integer.compare(x.getAge(),y.getAge());});

        Iterator<Employee> it  = list.iterator();
        while (it.hasNext()){
            System.out.println(it.next().getName());
        }
     }
}


public class Employee {
    private String name;
    private int age;
    private double salary;

    public Employee(String name, int age, double salary) {
        this.name = name;
        this.age = age;
        this.salary = salary;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
}

在这里插入图片描述

2.①声明函数式接口,接口中声明抽象方法,public String getValue(String str);
②声明类TestLambda ,类中编写方法使用接口作为参数,将一个字符串转换成大写,
并作为方法的返回值。
③再将一个字符串的第2个和第4个索引位置进行截取子串。


@FunctionalInterface
public interface Myfunction {
   public String getValue(String str);
}

public class Test {
    public static void main(String[] args) {
       String upper  = operate("abc",str->str.toUpperCase());
    }

    //对两个double类型数据进行操作
    public static String operate (String str,Myfunction Myfun){
    	return Myfun.getValue(str);
    }
}

3.①声明一个带两个泛型的函数式接口,泛型类型为<T,R>T为参数,R为返回值。
②接口中声明对应抽象方法
③在TestLambda类中声明方法,使用接口作为参数,计算两个long型参数的和。-
④再计算两个long型参数的乘积。-

package Chapters6.Lambda3;

public class Test {
    public static void main(String[] args) {
        operate(100,200,(x,y)->x+y);//加
        operate(100,200,(x,y)->x*y);//乘
    }

    //对两个double类型数据进行操作
    public static void operate (double a,double b,Myfunction<Double,Double> myfun){
        System.out.println(myfun.getValue(a,b));
    }
}

package Chapters6.Lambda3;

@FunctionalInterface
public interface Myfunction <T,R>{
    public R getValue(T t1,T t2);
}

无论你正遭遇着什么,你都要从落魄中站起来重振旗鼓,要继续保持热忱,要继续保持微笑,就像从未受伤过一样。

在这里插入图片描述
在这里插入图片描述

以梦为马,不负韶华。
原文地址:https://www.cnblogs.com/huangjiahuan1314520/p/13824941.html