广告
返回顶部
首页 > 资讯 > 后端开发 > Python >深入理解Java8新特性之Lambda表达式的基本语法和自定义函数式接口
  • 671
分享到

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

2024-04-02 19:04:59 671人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

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

1.写在前面

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

  • Lambda 表达式
  • 函数式接口
  • 方法引用与构造器引用
  • Stream api
  • 接口中的默认方法与静态方法
  • 新时间日期API
  • 其他新特性

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

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

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

3.Lambda表达式的基本语法

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

它将 Lambda 分为两个部分:

  • 左侧 :指定了 Lambda 表达式需要的所有参数。
  • 右侧 :指定了 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表达式的资料请关注编程网其它相关文章!

--结束END--

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

本文链接: https://www.lsjlt.com/news/156959.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作