java8之lanbda表达式介绍

本文介绍Java 8中的Lambda表达式及其与函数式接口的应用,包括Lambda表达式的语法特点、类型推断机制及如何利用函数式接口实现代码传递。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 XML Code 
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
package com.lyzx.day02;

import org.junit.Test;

/**
 * java8第一节<br/>
 * lambda表达式与函数式接口<br/>
 * Lambda是一个匿名函数,我们可以把 Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。<br/>
 * 可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升
 */
public class T4 {
    
    //从匿名内部类转向lambda表达式,运行test1和test2发现效果是一样的
    //lambda表达式的语法是()->{}
    //其中()里面写参数(函数的参数),{}里面写函数的函数体
    //()括号里面可以不写参数类型,因为要传入的函数式确定的
    
    //Lambda 表达式中的参数类型都是由编译器推断得出的。 Lambda 表达式中无需指定类型,
    //程序依然可以编译,这是因为 javac 根据程序的上下文,在后台
    //推断出了参数的类型。 Lambda 表达式的类型依赖于上
    //下文环境,是由编译器推断出来的。这就是所谓的“类型推断”
    @Test
    public void test1(){
        Runnable r = new Runnable() {
            @Override
            public void run() {
                System.out.println("线程。。。。");
            }
        };
        new Thread(r).start();
    }
    
    @Test
    public void test2(){
        Runnable r = ()->{System.out.println("线程.....");};
        new Thread(r).start();
    }
    
    /**
     * 什么是函数式接口
     *  只包含一个抽象方法的接口,称为函数式接口
     * 
     * 你可以通过 Lambda 表达式来创建该接口的对象。
     * (若 Lambda表达式抛出一个受检异常,那么该异常需要在目标接口的抽象方法上进行声明)。
     * 我们可以在任意函数式接口上使用 @FunctionalInterface 注解,
     * 这样做可以检查它是否是一个函数式接口,同时 javadoc 也会包
     * 含一条声明,说明这个接口是一个函数式接口
     * 
     * 
     * Consumer<T>  消费型接口    对类型为T的对象应用操作
     *  方法: void accept(T t)
     * Supplier<T>  供给型接口   返回类型为T的对象
     *  方法: T get();
     * Function<T,R> 函数型接口 对类型为T的对象应用操作,并返回结果。结果是R类型的对象。
     *  方法 :R apply(T t);
     * Predicate<T> 断定型接口 确定类型为T的对象是否满足某约束,并返回boolean 值。包
     *  方法boolean test(T t);
     */
    
    @Test
    public void test3(){
        Calc c = (x,y)->x+y;
        int result = c.calc(10,20);
        System.out.println(result);
        
        c = (x,y)-> x*y;
        result = c.calc(10,9);
        System.out.println(result);
    }
    
    /**
     * 成员方法
     * 参数calc是函数式接口 
     * 只有函数式接口才能被当做参数,如果使用非函数式接口作为参数
     * 那么在调用时会出现变异错误
     */
    public int myCalc(Calc calc,int a,int b){
        return calc.calc(a, b);
    }
    
    @Test
    public void test4(){
        int result = myCalc((x,y)->{ return x*y;},22,2);
        System.out.println(result);
    }
}

/**
 * calc接口只有一个抽象方法,所以是函数式接口
 */
@FunctionalInterface
interface Calc{
    public int calc(int a,int b);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值