栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java8新特性——Lambda表达式之基本语法 & 自定义函数式接口

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java8新特性——Lambda表达式之基本语法 & 自定义函数式接口

1.写在前面

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

  1. Lambda 表达式
  2. 函数式接口
  3. 方法引用与构造器引用
  4. Stream API
  5. 接口中的默认方法与静态方法
  6. 新时间日期API
  7. 其他新特性

速度更快、代码更少(增加了新的语法 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 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 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 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("ttt  张起灵-小哥   ",(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 {

    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 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 表达式兼容的函数式接口的类型。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/439301.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号