Java8新特性:lambda表达式总结

时间:2021-09-17 11:49:48

一、Lambda 表达式的基础语法

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

  • 左侧:Lambda 表达式的参数列表
  • 右侧:Lambda 表达式中所需执行的功能,即 Lambda 体

语法格式一:无参数,无返回值

?
1
() -> System.out.println("Hello Lambda!");

语法格式二:有一个参数,并且无返回值

?
1
(x) -> System.out.println(x)

语法格式三:若只有一个参数,小括号可以省略不写

?
1
x -> System.out.println(x)

语法格式四:有两个以上的参数,有返回值,并且 Lambda 体中有多条语句

?
1
2
3
4
Comparator<Integer> com = (x, y) -> {
    System.out.println("函数式接口");
    return Integer.compare(x, y);
};

语法格式五:若 Lambda 体中只有一条语句, return 和 大括号都可以省略不写

?
1
Comparator<Integer> com = (x, y) -> Integer.compare(x, y);

语法格式六:Lambda 表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出,数据类型,即“类型推断”

?
1
(Integer x, Integer y) -> Integer.compare(x, y);

 二、函数式接口

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

 函数式接口:接口中只有一个抽象方法的接口,称为函数式接口。 可以使用注解 @FunctionalInterface 修饰用来检查是否是函数式接口。

 Java8 内置的四大核心函数式接口

?
1
2
3
4
5
6
7
8
9
10
11
Consumer<T> : 消费型接口
       void accept(T t);
 
Supplier<T> : 供给型接口
       T get();
 
Function<T, R> : 函数型接口
       R apply(T t);
 
Predicate<T> : 断言型接口
       boolean test(T t);

三、内置的四大核心函数式接口用法实例

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package com.lyz.java8;
 
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;
 
import org.junit.Test;
 
/*
 * @author liuyazhuang
 * @version 1.0.0
 * @date 2018/8/19 15:02
 * @description Java8 内置的四大核心函数式接口
 *
 * Consumer<T> : 消费型接口
 *      void accept(T t);
 *
 * Supplier<T> : 供给型接口
 *      T get();
 *
 * Function<T, R> : 函数型接口
 *      R apply(T t);
 *
 * Predicate<T> : 断言型接口
 *      boolean test(T t);
 *
 */
public class TestLambda {
    
    //Predicate<T> 断言型接口:
    @Test
    public void test4(){
        List<String> list = Arrays.asList("Hello", "world", "Lambda", "www", "ok");
        List<String> strList = filterStr(list, (s) -> s.length() > 3);
        
        for (String str : strList) {
            System.out.println(str);
        }
    }
    
    //需求:将满足条件的字符串,放入集合中
    public List<String> filterStr(List<String> list, Predicate<String> pre){
        List<String> strList = new ArrayList<>();
        
        for (String str : list) {
            if(pre.test(str)){
                strList.add(str);
            }
        }
        
        return strList;
    }
    
    //Function<T, R> 函数型接口:
    @Test
    public void test3(){
        String newStr = strHandler("\t\t\t  我叫刘亚壮 ", (str) -> str.trim());
        System.out.println(newStr);
        
        String subStr = strHandler("我叫刘亚壮", (str) -> str.substring(2, 5));
        System.out.println(subStr);
    }
    
    //需求:用于处理字符串
    public String strHandler(String str, Function<String, String> fun){
        return fun.apply(str);
    }
    
    //Supplier<T> 供给型接口 :
    @Test
    public void test2(){
        List<Integer> numList = getNumList(10, () -> (int)(Math.random() * 100));
        
        for (Integer num : numList) {
            System.out.println(num);
        }
    }
    
    //需求:产生指定个数的整数,并放入集合中
    public List<Integer> getNumList(int num, Supplier<Integer> sup){
        List<Integer> list = new ArrayList<>();
        
        for (int i = 0; i < num; i++) {
            Integer n = sup.get();
            list.add(n);
        }
        
        return list;
    }
    
    //Consumer<T> 消费型接口 :
    @Test
    public void test1(){
        happy(10000, (m) -> System.out.println("每次消费:" + m + "元"));
    }
    
    public void happy(double money, Consumer<Double> con){
        con.accept(money);
    }
}

到此这篇关于Java8新特性:lambda表达式总结的文章就介绍到这了,更多相关Java lambda表达式内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/l1028386804/article/details/81837489