最简单学会Lamda表达式

149 阅读2分钟

「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

最简单学会Lamda表达式

前言--边使用边理解

Lamda表达式不仅简洁还有逼格,代码写起来很有大佬的感觉,但是每次都习惯性躺在舒适区,觉得fori很香。 为了轻松督促自己学会!
先从会使用开始,再到深入其概念和原理

Lamda表达式常用情况

集合下使用

无论是开发还是刷leecode,集合的遍历都是绕不开的!每一次使用集合时候我们用一次Lamda,自然用法就能熟记于心!

list

  1. 步骤一 image.png
  2. 步骤二 image.png
  3. 步骤三 image.png

HashMap实战

注意事项 image.png

成功运行

image.png

完整代码

    public static void main(String[] args) {
	// write your code here
        ArrayList<Integer> list=new ArrayList<>();
        HashSet<Integer> set=new HashSet<>();
        HashMap<Integer,Integer> map=new HashMap<>();
        for (int i = 0; i < 10; i++) {
            list.add(i*10);
            map.put(i,i*10);
        }
        //lamda 遍历 list
        list.forEach( (u)->{
           System.out.println(u);
        });
        //lamda 遍历 hashMap
        //int count =0;
        Integer[] count1={0};
        AtomicInteger count2= new AtomicInteger();
        map.forEach((k,v)->{
            if(v>20){
                //count++;// 不可以在Lambda表达式中修改外部变量,否则会提示Variable used in lambda expression should be final or effectively final
                count1[0]++;
                count2.getAndIncrement();
            }
        });
        System.out.println("count1[0]:  "+count1[0]);
        System.out.println("count2.get():  "+count2.get());
    }
}

Array下使用

看情况使用,有点麻烦

    public static void main(String[] args) {
	    // write your code here
        Integer[] array=new Integer[10];
        for (int i = 0; i < 10; i++) {
            array[i]=i*10;
        }
        Arrays.asList(array).forEach((item)->{
            System.out.println("array: "+item);
        });
    }

image.png

Comparator

Comparator实现类:(1)需要声明泛型;(2)需要实现compare方法,且参数列表有两个,参数类型与泛型类上声明一致

Comparator<Integer> comparator = (o1, o2) -> o1.compareTo(o2);

List<Integer> numbers = Lists.newArrayList(1, 2, 3);
numbers.sort((x1, x2) ->  x2.compareTo(x1));
numbers.forEach((x) -> {
    System.out.println(x);
});


List<User> users = Lists.newArrayList(new User(18), new User(22), new User(24));
users.sort((u1, u2) -> u2.age.compareTo(u1.age));
users.forEach((u) -> {
    System.out.println(u.age);
});

Thread

Thread thread = new Thread(() -> {
    System.out.println("HelloWorld");
});
thread.start();
    public static void main(String[] args) {
	    new Thread(()->{
            for (int i = 0; i < 10; i++) {
                System.out.println("i am thread  "+i);
            }
        }).start();
    }

image.png

Runnable

Runnable接口源码

    public static void main(String[] args) {
	    // write your code here
        Runnable runnable=()->{
            while (true){
                System.out.println("I am runable");
            }
        };
        new Thread(runnable).start();
        while (true){
            System.out.println("I am main");
        }
    }

image.png

Callable

Callable接口的Lambda表达式示例:

Callable<String> callable = () -> {
    return "HelloWorld";
};

Callable接口有返回值,Lambda主体可以直接使用表达式替代return语句,如下:
Callable<String> callable = () -> "HelloWorld";

概念

参数列表:函数参数列表 箭头:分割参数列表和主体 Lambda主体:函数主体(Note:如果是多行,需要加**{}**)

image.png 参数列表 参数列表使用括号(x1,....)来表示,其中参数可以声明参数类型,也可以不声明参数类型(编译器会根据上下文推断) 函数体(Lambda主体) Lambda表达式的函数体,既可以是代码块,也可以是表达式。 代码块:和普通方法的方法主体一致; 表达式:表达式会被执行并返回结果,其本质上是一种return语句的简写(省略了return和{})