文章目录

  • Lamda表达式
  • 简介:
  • 百科介绍:
  • 为什么要使用lambda表达式:
  • 语法
  • 实用展示
  • 工具类:
  • 基础用法:
  • 排序中使用:
  • 给字符串数组按长度大小排序:


Lamda表达式

简介:

百科介绍:

Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。使用 Lambda 表达式可以使代码变的更加简洁紧凑。其实质属于函数式编程的概念.

Java 8的一个大亮点是引入Lambda表达式,使用它设计的代码会更加简洁。当开发者在编写Lambda表达式时,也会随之被编译成一个函数式接口。下面这个例子就是使用Lambda语法来代替匿名的内部类,代码不仅简洁,而且还可读。

为什么要使用lambda表达式:

1、避免匿名内部类定义过多

2、可以让你的代码看起来很简洁

3、去掉了一堆没有意义的代码,只留下核心的逻辑。

也许你会说,我看了Lambda表达式,不但不觉得简洁,反而觉得更乱,看不懂了。那是因为我们还没有习惯,用的多
了,看习惯了,就好了。

语法

lambda 表达式的语法格式如下:

(parameters) -> expression
或 (parameters) ->{ statements; }

以下是lambda表达式的重要特征:

  • 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
  • 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
  • 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
  • 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定表达式返回了一个数值。

实用展示

java lambda视频教程 java中lambda_java lambda视频教程

工具类:

package Lambda;

public class Dog {
    String name;
    int age;
    Dog(){
        System.out.println("调用无参构造");
    }
    Dog(String name,int age){
        this.name=name;
        this.age=age;
        System.out.println("调用了有参构造");
    }

    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;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

基础用法:

package Lambda;

public class Lam {
    public static void main(String[] args) {
//        方法引用
        infa1 fl= Integer::sum;
//        省略大括号
        infa1 fl1 =(int a,int b)->a+b;
//        最全面写法
        infa1 fl2 =(int a,int b)->{
            int c=a*b;
            return c+a;
        };
//        省略参数类型
        infa1 fl3=(a,b)->a-b;
//        单个参数省略小括号
        infa2 fal=c -> c*c;
//        无参保留小括号
        infal3 fal3=()-> System.out.println("hello");
//        调用对象,方法引用
        Lam c=new Lam();
        infa2 fa2=c::testA;
//        构造方法引用
        Dogget dog1 = Dog::new;
        Dogget1 dog4=Dog::new;
//        结果同上,方式不同
        Dogget dog2 =()->new Dog();
        Dogget dog3 = ()->new Dog("小狗",2);


        System.out.println(fl.sum(3, 5));
        System.out.println(fl1.sum(3,9));
        System.out.println(fl2.sum(2, 4));
        System.out.println(fl3.sum(2, 4));
        System.out.println(fal.d(5));
        fal3.hello();
        System.out.println(fa2.d(10));
        System.out.println(dog1.getdog().toString());
        System.out.println(dog2.getdog().toString());
        System.out.println(dog3.getdog().toString());
        System.out.println(dog4.getdog("小狗", 3).toString());
    }
    public int testA(int a){
        return a-2;
    }

    interface infa1{
        int sum(int a,int b);
    }
    interface infa2{
        int d(int c);
    }
    interface infal3{
        void hello();
    }


//    构造方法调用
    interface Dogget{
        Dog getdog();
    }
    interface Dogget1{
        Dog getdog(String name,int age);
    }
}

运行结果:

8
12
10
-2
25
hello
8
调用无参构造
Dog{name='null', age=0}
调用无参构造
Dog{name='null', age=0}
调用了有参构造
Dog{name='小狗', age=2}
调用了有参构造
Dog{name='小狗', age=3}

进程已结束,退出代码0

排序中使用:

package Lambda;

import java.util.ArrayList;
import java.util.Comparator;

public class Lam2 {
    public static void main(String[] args) {
        Lam2 L=new Lam2();
        ArrayList<Dog> list=new ArrayList<>();
        list.add(new Dog("f",1));
        list.add(new Dog("e",2));
        list.add(new Dog("d",3));
        list.add(new Dog("c",4));
        list.add(new Dog("b",5));
        list.add(new Dog("a",6));
//      年龄大小排序
        list.sort((o1,o2)->o1.getAge()-o2.getAge());
        System.out.println(list);
//      名字首字母排序
        list.sort(((o1, o2) -> o1.getName().charAt(0)-o2.getName().charAt(0)));
//        list.sort((Comparator.comparingInt(o -> o.getName().charAt(0))));
        System.out.println(list);
//        Comparator接口
        list.sort(Comparator.comparingInt(Dog::getAge));
        System.out.println(list);
//        forEach方法的使用
        System.out.println("forEach方法打印");
        //   使用方法引用
        list.forEach(System.out::println);
        System.out.println("forEach方法打印");
        list.forEach(L::dogString);
    }
    public void dogString(Dog g) {

        System.out.print("Dog{" +
                "name='" + g.getName() + '\'' +
                ", age=" + g.getAge() +
                '}');
        System.out.println("  类内方法");
    }
}

运行结果:

[Dog{name='f', age=1}, Dog{name='e', age=2}, Dog{name='d', age=3}, Dog{name='c', age=4}, Dog{name='b', age=5}, Dog{name='a', age=6}]
[Dog{name='a', age=6}, Dog{name='b', age=5}, Dog{name='c', age=4}, Dog{name='d', age=3}, Dog{name='e', age=2}, Dog{name='f', age=1}]
[Dog{name='f', age=1}, Dog{name='e', age=2}, Dog{name='d', age=3}, Dog{name='c', age=4}, Dog{name='b', age=5}, Dog{name='a', age=6}]
forEach方法打印
Dog{name='f', age=1}
Dog{name='e', age=2}
Dog{name='d', age=3}
Dog{name='c', age=4}
Dog{name='b', age=5}
Dog{name='a', age=6}
forEach方法打印
Dog{name='f', age=1}  类内方法
Dog{name='e', age=2}  类内方法
Dog{name='d', age=3}  类内方法
Dog{name='c', age=4}  类内方法
Dog{name='b', age=5}  类内方法
Dog{name='a', age=6}  类内方法

进程已结束,退出代码0

给字符串数组按长度大小排序:

package Lambda;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
/*
* 字符串数组按长度大小排序
* */
public class Soulution {
    public static void main(String[] args) {
        String[] arr={"a","ab","c","abc" };
        sortByLength(arr);
    }
    public static void sortByLength(String[] strArr) {
        ArrayList<String> list = new ArrayList<>(Arrays.asList(strArr));
        list.sort((Comparator.comparingInt(String::length)));
        list.forEach(System.out::println);
//        一行解决
//        Arrays.stream(strArr).sorted(Comparator.comparingInt(String::length)).forEach(System.out::println);
    }
}

运行结果:

a
c
ab
abc

进程已结束,退出代码0