首页 > 编程语言 >Java 8特性,函数式接口编程

Java 8特性,函数式接口编程

时间:2023-08-04 13:44:47浏览次数:310  
标签:Java 函数 编程 System 接口 println public

一、函数式接口简介

  1. 什么是函数式接口

在接口中,有且只有一个抽象方法,那么这个接口就是函数式接口。函数式接口是Lambda表达式使用的前提条件。

  1. 为什么使用函数式接口

在Java中不支持将函数作为一个数据,也就不能将函数作为方法的参数进行传递。因此给函数外加一层接口的声明,相当于为其穿上一件漂亮的外衣包装起来,如果需要将函数作为方法传递时,就可以传递函数所在接口的实现类对象,来间接的传递方法内容了。

  1. 函数式接口定义

使用@FunctionalInterface注解来检查一个接口是否是一个函数式接口。放在接口定义的上方,如果接口是函数式接口,编译通过;如果不是,则编译失败。

  1. 与Lambda表达式的关系

Lambda表达式:函数式接口是Lambda表达式的基础,通过函数式接口可以定义Lambda表达式的参数类型和返回类型。Lambda表达式可以简洁地表示一个函数,可以用于替代匿名内部类的写法,使代码更加简洁和易读。

二、函数式接口案例

通过代码案例进行学习。代码编程提供思路,学习编程思想尤为重要!

  1. 创建一个带有一个方法的接口
package org.example;

@FunctionalInterface
public interface TestFuncation{

   public void fun();
}
  1. 使用函数式接口运行测试
package org.example;

public class Main {

    public static void test(TestFuncation myfun){
        myfun.fun();
    }

    public static void main(String[] args) {
        //1.使用匿名内部类的方式
        TestFuncation myfun = new TestFuncation() {
            @Override
            public void fun() {
                System.out.println("使用匿名内部类的方式实现函数式接口....");
            }
        };

        test(myfun);

        //2.直接传递匿名内部类
        test(new TestFuncation() {
            @Override
            public void fun() {
                System.out.println("使用直接传递匿名内部类的方式....");
            }
        });

        //3.使用Lambda表达式的方式使用函数式接口
        test(()-> System.out.println("使用Lambda表达式的方式使用函数式接口..."));
    }

}

运行结果:

使用匿名内部类的方式实现函数式接口....
使用直接传递匿名内部类的方式....
使用Lambda表达式的方式使用函数式接口...
Process finished with exit code 0

  1. 进阶使用

使用Java8中提供了一些常用的函数式接口,在使用类似功能的时候,不需要额外定义接口,直接使用jdk8中提供的即可。

接下来直接提供代码样例:

package org.example;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;

public class TestConsumer {

    //定义方法实现用户消费的功能
    public static void userConsumer(Double money, Consumer<Double> con){
        con.accept(money);
    }

    //测试
    public static void main(String[] args) {
        //客户1:花了X元, 买了一盒化妆品
        userConsumer(500.0,money -> System.out.println("客户1花了"+money+"买了一盒化妆品"));

        //客户2:花了X元, 吃了一顿美食
        userConsumer(800.0,money -> System.out.println("客户2花了"+money+"元钱吃了一顿美食"));

        //1.客户1 : 要5个1-10之间的随机数整数
        List<Integer> list1 = useSupplier(5, () -> (int) (Math.random() * 10 + 1));

        System.out.println(list1);

        //2.客户2 : 要8个1-100之间的偶数
        List<Integer> list2 = useSupplier(8, () -> {
            int num = (int) (Math.random() * 100 + 1);
            if (num % 2 == 0) {
                return num;
            } else {
                return num + 1;
            }
        });

        System.out.println(list2);


        // 1)客户1 : y为x的2倍
        System.out.println(useFunction(5, x -> x * 2));// 10

        // 2) 客户2 : y为x的平方
        System.out.println(useFunction(-9, x -> x * x));// 81
    }


    /*
     * 根据客户需求,返回n个满足某个规律的数
     * */
    public static List<Integer> useSupplier(int count, Supplier<Integer> sup){
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < count; i++) {
            Integer integer = sup.get();
            list.add(integer);
        }
        return list;
    }


    /*
     * 根据x计算y
     * 参数x代表用户传递的数
     * 参数2代表用户要求得到结果的实现方式
     * */
    public static int useFunction(int x, Function<Integer, Integer> fun) {
        return fun.apply(x);
    }
}

执行结果:

客户1花了500.0买了一盒化妆品
客户2花了800.0元钱吃了一顿美食
[2, 9, 3, 10, 6]
[26, 54, 14, 100, 14, 28, 100, 66]
10
81

Process finished with exit code 0

最后,关于编程思想,通过询问GPT回答以下内容:

编程思想是指在软件开发过程中应用的一套理念、原则和方法。下面列举了几种常见的编程思想:

面向对象编程(Object-Oriented Programming, OOP):将问题划分为对象,通过定义对象的属性和方法来实现程序的组织和功能。OOP 基于封装、继承和多态的概念,提倡代码的可重用性、可维护性和可扩展性。

函数式编程(Functional Programming,FP):将计算视为函数的应用,强调使用纯函数来进行编程,避免共享状态和可变数据。函数式编程注重数据的不变性、函数的组合和高阶函数的使用。

响应式编程(Reactive Programming):基于事件流和数据流的概念,将程序建模为一系列的数据变化和事件响应。响应式编程关注数据流的转换和异步操作的处理,使得开发响应式、高效和可伸缩的应用程序更为容易。

结构化编程(Structured Programming):通过顺序、选择和循环等结构化控制流程,以及使用函数和子程序来组织代码。结构化编程强调模块化和可读性,使得程序逻辑更加清晰和易于理解。

领域驱动设计(Domain-Driven Design, DDD):将软件开发过程中的关注重点放在领域模型和业务需求上,通过深入理解领域知识来指导软件系统的设计与实现。DDD 强调建立统一的语言和模型,以及将复杂领域划分为上下文边界。

测试驱动开发(Test-Driven Development, TDD):在编写代码之前先编写测试用例,通过反复编写测试和实现代码的周期来推动开发。TDD 强调编写可测试的、高质量的代码,并倡导在开发过程中进行频繁的自动化测试。

这些编程思想并不是相互排斥的,很多时候可以结合使用,根据实际情况选择合适的思想来解决问题。同时,不同的编程语言和开发环境可能对某些思想有更好的支持,开发者可以根据需要选择适合自己的编程思想。

标签:Java,函数,编程,System,接口,println,public
From: https://www.cnblogs.com/htmsmile/p/17605673.html

相关文章

  • Java多线程总结(超详细总结)
    (Java多线程总结)1.创建线程的方式方式1继承于Thread类创建一个继承于Thread类的子类重写Thread类的run()-->将此线程执行的操作声明在run()中创建Thread类的子类的对象4.通过此对象调用start()例子:遍历100以内的所有的偶数classMyThreadextendsThread{//......
  • 无语!Jenkins 也宣布弃用 Java 8(文末送书)
    继Java之父JamesGosling先前称,开发者应尽快弃用JDK8,可以选择JDK17LTS,因为后者在各个方面都带来了巨大的改进。开源Devops工具Jenkins宣布:从6月28日发布的Jenkins2.357和即将发布的9月LTS版本开始,Jenkins最低需要Java11。Jenkins最初称为Hudson,是一款......
  • Java 大神整理的 Spring 笔记,强得起飞 !
    强烈推荐大家阅读:阿里大佬的spring学习笔记,基本涵盖了Spring所有核心知识点及原理,建议大家至少看3遍,便可成为一个Spring高手,超越99%的人,学完之后再去学Spring的其他框架,比如SpringBoot,简直就是小意思,文末获取高清pdfJava程序员加餐福利:小咖最近整理一份BAT面试资料,覆盖了Java核心......
  • 成为优秀Java开发者,需要看这几本书
    Java作为企业级应用开发的首选,深受互联网大厂的青睐。对于求职找工作的朋友来说,Java可能仍然是后端工程师的优选,虽然Python热度不断上升,但是Java作为老牌语言,在企业中的地位依旧稳固,它的市场空间仍然是很难撼动的。不同级别的IT从业者之间的工资差别非常大,相信每位程序员都不甘心只......
  • java 用PDFBox 删除 PDF文件中的某一页
    依赖:org.apache.pdfboxpdfbox-app1.8.10java用PDFBox删除PDF文件中的某一页,前n页,后n页,效率低,不推荐使用packagecom.everjiankang;importjava.io.File;importorg.apache.pdfbox.pdmodel.PDDocument;/**运行效率很慢,因为每次删除一页就读取和保存一次文件,初始文件名格式:xxx......
  • mybatis mapper接口实例化原理
       面试题来了:“我们都知道mybatis的mapper接口是没有实现类的,在使用的时候你知道它是如何实例化的吗?”懵逼的我:“知道啊,用的是jdk自带的动态代理;”;饥渴的面试官:“嗯,没错,继续说,它底层做了哪些事情?”;懵逼的我:“就是动态代理啊,还有啥?”得意的面试官:“这样子啊,那你回去等......
  • Java中如何向一个string类型的数组中添加数据
    在Java中,String类型的数组是固定长度的,一旦创建后就无法改变其长度。如果你需要向一个String类型的数组中添加数据,可以考虑使用ArrayList或LinkedList等可变长度的集合类型来代替。使用 ArrayList,你可以通过调用add()方法来向集合中添加元素,例如://创建一个ArrayList......
  • java锁总结
    Java中的锁主要用于保障多并发线程情况下数据的一致性。在多线程编程中为了保障数据的一致性,我们通常需要在使用对象或者方法之前加锁,这时如果有其他线程也需要使用该对象或者该方法,则首先要获得锁,如果某个线程发现锁正在被其他线程使用,就会进入阻塞队列等待锁的释放,直到其他线程......
  • 为了成为Java大牛,我决定手写个JVM~
    JVM对我们很多人来说就像个黑盒子,无从下手,但是又是我们JavaCoder不得不去深入研究的一门技术国内玩JVM的大牛很少,知名的就那么几个,而玩好JVM又教好JVM的人更是少之又少。今天给大家介绍其中一位,江湖人送外号道格牙的子牙老师。下面的时间,交给他。哈喽,我就是江湖人送外号[......
  • 反内卷 | Java程序员不可错过的10本书!
    大家好,我是飘渺。又到了一年一度的双11了,想必不少小伙伴打算趁此机会入手几本好书。在此我也为大家整理了一份书单,如果你还在纠结犹豫,不妨看看我为整理的这几本。PS:今年京东的图书活动大致如下:活动一“多买优惠”,即:1件7.5折,两件6.5折活动二:“满减”,即:每满100-50这两个活动结算的时......