文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

深入理解Java8新特性之Lambda表达式的基本语法和自定义函数式接口

2024-04-02 19:55

关注

1.写在前面

目前我们学习Java主要用到的应该就是Java8了,或者说大部分企业当前使用的也是Java8。那么既然Java8的应用如此之广泛,一定有一些亮点所在:

速度更快、代码更少(增加了新的语法 Lambda 表达式)、强大的 Stream API、便于并行、最大化减少空指针异常 Optional。

2.为什么要使用Lambda表达式?

Lambda 是一个 匿名函数 数,我们可以把 Lambda表达式理解为是 一段可以传递的 代码(将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java语言表达能力得到了提升。

3.Lambda表达式的基本语法

Lambda 表达式在Java 语言中引入了一个新的语法元素和操作符。这个操作符为 “ -> ” , 该操作符被称为 Lambda 操作符或剪头操作符。

它将 Lambda 分为两个部分:

具体的就看下面的代码案例。


package com.szh.java8;
 
import org.junit.Test;
 
import java.util.Comparator;
import java.util.function.Consumer;
 

public class MyTest2 {
 
    
    @Test
    public void test1() {
        Runnable r1 = new Runnable() {
            @Override
            public void run() {
                System.out.println("Hello World!!!");
            }
        };
        r1.run();
 
        System.out.println("---------------------------");
 
        Runnable r2 = () -> System.out.println("Hello World!!!");
        r2.run();
    }
 
}


package com.szh.java8;
 
import org.junit.Test;
 
import java.util.Comparator;
import java.util.function.Consumer;
 

public class MyTest2 {
 
    
    @Test
    public void test2() {
        Consumer<String> consumer = (str) -> System.out.println(str);
        consumer.accept("Lambda表达式真好用....");
    }
 
}


package com.szh.java8;
 
import org.junit.Test;
 
import java.util.Comparator;
import java.util.function.Consumer;
 

public class MyTest2 {
 
    
    @Test
    public void test3() {
        Comparator<Integer> comparator = (x,y) -> {
            System.out.println("函数式接口....");
            return Integer.compare(x,y);
        };
    }
 
}

package com.szh.java8;
 
import org.junit.Test;
 
import java.util.Comparator;
import java.util.function.Consumer;
 

public class MyTest2 {
 
    
    @Test
    public void test4() {
        Comparator<Integer> comparator = (x,y) -> Integer.compare(x,y);
    }
 
}

上述 Lambda 表达式中的参数类型都是由编译器推断得出的。Lambda 表达式中无需指定类型,程序依然可以编译,这是因为 javac 根据程序的上下文,在后台
推断出了参数的类型。Lambda 表达式的类型依赖于上下文环境,是由编译器推断出来的。这就是所谓的 “类型推断”。

4.自定义函数式接口

只包含一个抽象方法的接口,称为 函 数 式 接 口。

你可以通过 Lambda 表达式来创建该接口的对象。(若 Lambda表达式抛出一个受检异常,那么该异常需要在目标接口的抽象方法上进行声明)

我们可以在任意函数式接口上使用 @FunctionalInterface 注解,这样做可以检查它是否是一个函数式接口,同时 javadoc 也会包含一条声明,说明这个接口是一个函数式接口。

就像Runnable接口一样,它就是一个典型的函数式接口。


@FunctionalInterface
public interface Runnable {
    
    public abstract void run();
}

那么我们肯定也可以自定义函数式接口了,首先是没有泛型的自定义函数式接口。


package com.szh.java8.two;
 

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

package com.szh.java8.two;
 

public class TestLambda {
 
    private static String strHandler(String str,MyFunction mf) {
        return mf.getValue(str);
    }
 
    public static void main(String[] args) {
        //去除首尾空格
        String trimStr = strHandler("\t\t\t  张起灵-小哥   ",(str) -> str.trim());
        System.out.println(trimStr);
 
        //转为大写
        String upperStr = strHandler("hello world",str -> str.toUpperCase());
        System.out.println(upperStr);
 
        //部分截取
        String newStr = strHandler("学Java的冷少",(str) -> str.substring(0,5));
        System.out.println(newStr);
    }
}

下面再来看一个带泛型的函数式接口。


package com.szh.java8.three;
 

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

package com.szh.java8.three;
 
import com.szh.java8.two.MyFunction;
 

public class TestLambda {
 
    private static void operation(Long l1,Long l2,MyFunction2<Long,Long> mf) {
        System.out.println(mf.getValue(l1,l2));
    }
 
    public static void main(String[] args) {
        //和
        operation(100L,200L,(x,y) -> x + y);
 
        //积
        operation(300L,500L,(x,y) -> x * y);
    }
}

作为参数传递 Lambda 表达式:为了将 Lambda 表达式作为参数传递 ,接收 Lambda 表达式的参数类型必须是与该 Lambda 表达式兼容的函数式接口的类型。

以上就是深入理解Java8新特性之Lambda表达式的基本语法和自定义函数式接口的详细内容,更多关于Java Lambda表达式的资料请关注编程网其它相关文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯