Java8新特性1——函数式接口&lambda表达式

这篇具有很好参考价值的文章主要介绍了Java8新特性1——函数式接口&lambda表达式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Java8新特性1——函数式接口&lambda表达式

注:以下内容基于Java 8,所有代码都已在Java 8环境下测试通过

目录:

  • Java8新特性1——函数式接口&lambda表达式
  • Java8新特性2——方法引用
  • Java8新特性3——Stream

1. 函数式接口

如果在一个接口中,有且只有一个抽象方法,则该接口被称为函数式接口。如:

interface Test {
    void test();
}

注:

可以在接口前使用 @FunctionalInterface 注解,判断这个接口是否是⼀个函数式接口。如:

@FunctionalInterface
interface Test1 {//有且仅有一个抽象方法,是函数式接口
    void test();
}

@FunctionalInterface
interface Test2 {//有且仅有一个抽象方法,是函数式接口
    void test();

    default void f() {
    }
}

@FunctionalInterface
interface Test3 {//没有抽象方法,不是函数式接口,编译器报错
}

@FunctionalInterface
interface Test4 {//有多个抽象方法,不是函数式接口,编译器报错
    void test1();

    void test2();
}

2. lambda表达式

2.1 lambda表达式作用

lambda表达式是一个匿名函数,用于简化函数式接口的实现

在Java中,接口不能实例化,但接口对象可以指向实现类对象。当没有实现类对象时,可以通过匿名类的方式,如:

public class Main {
    public static void main(String[] args) {
        Test test = new Test() {
            @Override
            public void f() {
                System.out.println("使用匿名函数的方式实现了函数式接口");
            }
        };
        test.f();
    }
}

@FunctionalInterface
interface Test {
    void f();
}

使用匿名类的方式代码不是很简洁,因此引入了lambda表达式,如:

public class Main {
    public static void main(String[] args) {
        Test test = () -> System.out.println("使用lambda表达式的方式实现了函数式接口");
        test.f();
    }
}

@FunctionalInterface
interface Test {
    void f();
}

在使用lambda表达式之后,代码变得简洁了很多,因此可以说lambda表达式是和函数式接口相辅相成的。在上面的代码中,lambda表达式实际做了以下三个工作:

  1. 自动实现接口

    Test test = new Test();
    
  2. -> 前的参数自动添加到抽象函数里面(上面代码中抽象函数没有参数)

    void f();
    
  3. -> 后的语句作为抽象函数的方法体

    void f(){
        System.out.println("使用lambda表达式的方式实现了函数式接口");
    }
    

2.2 lambda表达式语法格式

lambda表达式的格式如下:

(参数1, 参数2, ……) -> {
    方法体;
}

其中:

  • 参数要求和函数式接口中抽象方法的参数一致(包括数量和类型以及顺序)
  • 如果函数式接口中抽象方法有返回值,则实现的时候也需要返回值
public class Main {
    public static void main(String[] args) {
        Test test = (int x, int y) -> {//参数、返回值与函数式接口中抽象方法一致
            return x + y;
        };
        test.add(1, 2);
    }
}

@FunctionalInterface
interface Test {
    int add(int x, int y);
}

2.3 lambda表达式的精简

  • 参数精简

    • 参数类型可以省略,若省略一个类型参数,则所有的类型参数都要省略
    • 若只有一个参数,则小括号可以省略
    • 若参数为0或者多于1个,则小括号不可以省略
  • 方法体精简

    • 若方法体中只有一行代码,则花括号可以省略
    • 若方法体中只有一行代码且是return语句,则在省略大括号的时候还需要去掉return关键字
    • 若方法体中有多行代码或者使用了return语句,则大括号不可以省略
    public class Main {
        public static void main(String[] args) {
            //只有一个参数,省略了小括号
            //只有一条return语句,省略了花括号即return关键字
            Test test = x -> Math.exp(x);
    
            test.exp(1);
        }
    }
    
    @FunctionalInterface
    interface Test {
        double exp(double x);
    }
    

    2.4 变量作用域

    1. lambda表达式只可以访问外部变量,但不能修改外部变量
    2. lambda表达式访问的外部变量一般都是声明为 final 的,但也可以不用声明为 final ,但该变量在声明后不能被修改
    3. lambda表达式中不允许声明一个与局部变量同名的参数或局部变量
    public class Main {
        static final int a = 0;
    
        public static void main(String[] args) {
            final int num1 = 10;
            int num2 = 20;
    
            //num2 = 40; //声明后不能被修改
            Test test1 = x -> {
                System.out.println(num1);//可以访问外部被声明为 final 的变量
                System.out.println(num2);//可以访问外部的普通变量
    
                //num1 = 20;//只能访问,不能修改
                //num2 = 20;//只能访问,不能修改
    
                //int num1 = 20;//不允许声明一个与局部变量同名的局部变量
                return Math.exp(x);
            };
            //num2 = 40; //声明后不能被修改
    
            test1.exp(1);
    
            //不允许声明一个与局部变量同名的参数
            //Test test2 = num1 -> Math.exp(num1);
        }
    }
    
    @FunctionalInterface
    interface Test {
        double exp(double x);
    }
    

3. 四大函数式接口

为了让开发者高效地使用函数式接口,Java 8 在 java.util.function 包下提供了许多函数式接口,以下四种是最为常见的:

接口原型 抽象方法 备注
Consumer< T > accept(T t) 消费型接口
Supplier< T > T get() 供给型接口
Function<T, R> R apply(T t) 函数型接口
Predicate< T > boolean test(T t) 断言型接口

3.1 Consumer< T >:消费型接口

该接口只接收输入参数但不输出返回值,消费对象,只进不出

  • 接口原型:

    @FunctionalInterface
    public interface Consumer<T> {
        void accept(T t);
    }
    
  • 使用示例:

    import java.util.function.Consumer;
    
    public class Main {
        public static void main(String[] args) {
            Consumer<Integer> acc = (t) -> System.out.println(t);//实现 Consumer 接口
            
            acc.accept(10);
        }
    }
    

3.2 Supplier< T >:供给型接口

该接口只输出返回值但不接收输入参数,生成对象,只出不进

  • 接口原型:

    public interface Supplier<T> {
        T get();
    }
    
  • 使用示例:

    import java.util.function.Supplier;
    
    public class Main {
        public static void main(String[] args) {
            Supplier<Integer> sup = () -> 10;//实现 Supplier 接口
            
            System.out.println(sup.get());
        }
    }
    

3.3 Function<T, R>:函数型接口

该接口既接收输入参数又输出返回值,用于指定特定功能,有进有出

  • 接口原型:

    @FunctionalInterface
    public interface Function<T, R> {
        R apply(T t);
    }
    
  • 使用示例:

    import java.util.function.Function;
    
    public class Main {
        public static void main(String[] args) {
            Function<Integer, String> fun = (x) -> {//实现 Function 接口
                String out = "输入的整数是" + x;
                return out;
            };
    
            System.out.println(fun.apply(10));
        }
    }
    

3.4 Predicate< T >:断言型接口

该接口既接收输入参数又输出返回值,且返回值只能是布尔值,用于条件判断,有进有出

  • 函数原型:

    public interface Predicate<T> {
        boolean test(T t);
    }
    
  • 使用示例:文章来源地址https://www.toymoban.com/news/detail-693574.html

    import java.util.function.Predicate;
    
    public class Main {
        public static void main(String[] args) {
            Predicate<Integer> pre = (x) -> x % 2 == 0;//实现 Predicate 接口
    
            int a = 10;
            if (pre.test(10)) {
                System.out.println(a + "是偶数");
            } else {
                System.out.println(a + "是奇数");
            }
        }
    }
    

到了这里,关于Java8新特性1——函数式接口&lambda表达式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 常用Java代码-Java中的Lambda表达式和函数式接口

    Java中的Lambda表达式和函数式接口是Java 8中引入的一种新特性,允许编写简洁、可读性强的代码。Lambda表达式允许将简单的代码块作为参数传递给函数,而函数式接口则是一种只有一个抽象方法的接口,可以用于定义Lambda表达式。 下面是一个Lambda表达式的示例: 在这个例子中

    2024年01月18日
    浏览(40)
  • Java 8及以上新特性:Lambda表达式、Stream API、Optional类与接口默认方法(四)

    目录 一、接口默认方法 1.1 概念解析: 1.2 应用场景: 1.3 使用注意事项: 1.4 使用示例: 二、结论 1.1 总结Java 8及以上版本四大新特性的重要意义与价值: 1.2 鼓励读者积极学习并运用这些新特性: 1.3 对未来Java版本可能引入的新特性进行展望: 1.1 概念解析: 接口默认方法

    2024年04月13日
    浏览(35)
  • Java8 lambda 表达式 forEach 如何提前终止?

    首先,让我们看一下Java 8中如何使用forEach()方法。forEach()方法接受一个Consumer接口作为参数,该接口定义了一个accept()方法,该方法接受一个对象并对其执行一些操作。因此,我们可以通过Lambda表达式来实现Consumer接口。下面是一个使用Lambda表达式的forEach()方法的示例: 在上面

    2024年02月12日
    浏览(31)
  • java学习路程之篇三、进阶知识、面向对象高级、接口新特性、代码块、内部类、Lambda表达式、窗体、组件、事件

    概述 生成值类型响应式数据 通过 .value 值修改 生成对象和数组类型的响应式对象选用 reactive 方式比较好 html JavaScript 概述 reactive 方法根据传入的对象,创建返回一个深度响应式对象。响应式对象看起来和传入的对象一样。但是,响应式对象属性值改动,不管层级有多深,都

    2024年02月16日
    浏览(26)
  • Java新特性:Lambda表达式

    Java新特性:Lambda表达式 Lambda 表达式(Lambda expression),也可称为闭包(Closure),是 Java(SE)8 中一个重要的新特性。Lambda 表达式允许我们通过表达式来代替功能接口。Lambda 表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表

    2024年02月13日
    浏览(42)
  • Java 8 新特性之Lambda表达式

    函数式编程(Functional Programming)是把函数作为基本运算单元,函数可以作为变量,可以接收函数,还可以返回函数。历史上研究函数式编程的理论是Lambda演算,所以我们经常把支持函数式编程的编码风格称为Lambda表达式。 在Java中使用Lambda表达式的前提:需要是函数接口。

    2024年01月22日
    浏览(31)
  • Java 8 新特性——Lambda 表达式(2)

            Java Stream函数式编程接口最初在Java 8中引入,并且与 lambda 一起成为Java开发里程碑式的功能特性,它极大的方便了开放人员处理集合类数据的效率。         Java Stream就是一个数据流经的管道,并且在管道中对数据进行操作,然后流入下一个管道。有学过linux

    2024年02月11日
    浏览(29)
  • Lambda表达式 & 函数式接口 & Stream流

    目录 一. Lambda表达式 1. 函数式编程思想概述 2. Lambda的优化 3. Lambda的格式 标准格式: 参数和返回值: 省略格式: 4. Lambda的前提条件  二. 函数式接口 1. 概述 格式 FunctionalInterface注解 2. 常用函数式接口 Supplier接口 Consumer接口 Function接口 Predicate接口 三. Stream流 1 引言 2. 流式思

    2024年02月08日
    浏览(89)
  • JAVA8-lambda表达式8:在设计模式-模板方法中的应用

    JAVA8-lambda表达式1:什么是lambda表达式 JAVA8-lambda表达式2:常用的集合类api JAVA8-lambda表达式3:并行流,提升效率的利器? JAVA8-lambda表达式4:Optional用法 java8-lambda表达式5:toMap引发的线上故障 JAVA8-lambda表达式6:重构和定制收集器 JAVA8-lambda表达式7:重要的函数接口 最近在公司

    2024年02月14日
    浏览(39)
  • 【Java系列】JDK 1.8 新特性之 Lambda表达式

    Lambda是一个匿名函数,我们可以将Lambda表达式理解为一段可以传递的代码(将代码像数据一样传递)。使用它可以写出简洁、灵活的代码。作为一种更紧凑的代码风格,使java语言表达能力得到提升。 结果: ​19:43:39.303 [main] INFO com.chen.test.JAVA8Features.Demo01 - 我是没有使用Lambda表

    2024年02月22日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包