首页 > 编程语言 >java函数式编程

java函数式编程

时间:2024-10-27 22:51:04浏览次数:5  
标签:java 函数 编程 list System 接口 println 返回值 out

目录

Lambda表达式

Lamabda表达式语法

语法重要特征

代码示例

Lambda表达式引用方法

Lambda表达式创建线程

Lambda表达式中的闭包问题

常用的函数式接口

Consumer接口的使用

Predicate接口的使用

Comparator接口的使用

Stream流

Stream流的生成方式

常用方法

数据过滤

数量限制

数据排序


Lambda表达式

()->{}

lambda的jdk8的新特性,可以取代大部分匿名内部类,优化代码

所有的Lambda的类型都是一个接口,也就是这个接口的实现,

Lambda表达式本身就是接口的实现

函数式接口:接口中只有一个接口函数需要被实现的接口类型

接口要求: Lambda 规定接 接口中只能有一个需要被实现的方法,不是规定接口中只能有一个方法。 jdk 8 中有另一个新特性: default , 被 default 修饰的方法会有默认实现,不是必须被实现的方法,所以不影响 Lambda 表达式的使用。

@FunctionalInterface标记在接口上,指明这是一个函数式接口

Lamabda表达式语法

()->{}

() 用来描述参数列表,如果有多个参数,参数之间用逗号隔开,如果没有参数,留空即可; -> 读作 (goes to) ,为 lambda 运算符 ,固定写法,代表指向动作; {} 代码块,具体要做的事情,也就是方法体内容;

语法重要特征

可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。 可选的参数圆括号: 一个参数 无需定义圆括号,但多个参数需要定义圆括号。 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表 达式返回了一个数值。

代码示例

//无参数无返回值接口
@FunctionalInterface
interface NoParamNoReturn{
    void method();
}
//一个参数,无返回值接口
@FunctionalInterface
interface OneParamNoReturn{
    void method(int a);
}
//两个/多个参数无返回值接口
@FunctionalInterface
interface ManyParamNoReturn{
    void method(int a,int b);
}
//有返回值无参数接口
@FunctionalInterface
interface NoParamHaveReturn{
    int method();
}
//一个参数有返回值接口
@FunctionalInterface
interface OneParamHaveReturn{
    int method(int a);
}
//多个参数有返回值接口
@FunctionalInterface
interface ManyParamHaveReturn{
    int  method(int a,int b);
}


public class Test03 {
    public static void main(String[] args) {
        //无参数无返回值接口
        NoParamNoReturn noParamNoReturn = ()->{
            System.out.println("没有参数也没有返回值");
        };
        noParamNoReturn.method();
        //一个参数,无返回值接口
        OneParamNoReturn oneParamNoReturn = (int a) -> {
            System.out.println("一个参数,没有返回值接口"+a*10);
        };
        oneParamNoReturn.method(2);
        //两个/多个参数无返回值接口
        ManyParamNoReturn manyParamNoReturn =(int a,int b)->{
            System.out.println("//两个/多个参数无返回值接口:"+(a+b));
        };
        manyParamNoReturn.method(45,23);

        //有返回值无参数接口
        NoParamHaveReturn noParamHaveReturn = ()->{
            System.out.println("有返回值无参数接口");
            return 100;
        };
        int value = noParamHaveReturn.method();
        System.out.println(value);
        //一个参数有返回值接口
        OneParamHaveReturn oneParamHaveReturn =(int a )->{
            System.out.println("一个参数有返回值接口");
            return a*20;
        };
        System.out.println(oneParamHaveReturn.method(33));

        //多个参数有返回值接口
        ManyParamHaveReturn manyParamHaveReturn =(int a,int b)->{
            System.out.println("多个参数有返回值接口");
            return a+b;
        };
        System.out.println(manyParamHaveReturn.method(20,78));
    }
}

代码简写:

        //无参数无返回值接口
//        NoParamNoReturn noParamNoReturn = ()->{
//            System.out.println("没有参数也没有返回值");
//        };

        NoParamNoReturn noParamNoReturn=()->System.out.println("没有参数也没有返回值");
        noParamNoReturn.method();
        System.out.println("-----------------------------------------------");
        //一个参数,无返回值接口
//        OneParamNoReturn oneParamNoReturn = (int a) -> {
//            System.out.println("一个参数,没有返回值接口"+a*10);
//        };
        OneParamNoReturn oneParamNoReturn =a -> System.out.println("一个参数,没有返回值接口"+a*10);
        oneParamNoReturn.method(2);
        System.out.println("-------------------------------------------------");
        //两个/多个参数无返回值接口
//        ManyParamNoReturn manyParamNoReturn =(int a,int b)->{
//            System.out.println("//两个/多个参数无返回值接口:"+(a+b));
//        };
        ManyParamNoReturn manyParamNoReturn = (a,b)->System.out.println("//两个/多个参数无返回值接口:"+(a+b));
        manyParamNoReturn.method(45,23);
        System.out.println("-----------------------------");
        //有返回值无参数接口
//        NoParamHaveReturn noParamHaveReturn = ()->{
//            System.out.println("有返回值无参数接口");
//            return 100;
//        };
        NoParamHaveReturn noParamHaveReturn =()->100;
        int value = noParamHaveReturn.method();
        System.out.println(value);
        //一个参数有返回值接口
//        OneParamHaveReturn oneParamHaveReturn =(int a )->{
//            System.out.println("一个参数有返回值接口");
//            return a*20;
//        };
        OneParamHaveReturn oneParamHaveReturn =a->{
            System.out.println("一个参数有返回值接口");
            return a*20;
        };
        System.out.println(oneParamHaveReturn.method(33));

        //多个参数有返回值接口
//        ManyParamHaveReturn manyParamHaveReturn =(int a,int b)->{
//            System.out.println("多个参数有返回值接口");
//            return a+b;
//        };
        ManyParamHaveReturn manyParamHaveReturn=(a,b)->a+b;
        System.out.println(manyParamHaveReturn.method(20,78));

Lambda表达式引用方法

使用 lambda表达式指向一个已经存在的方法作为抽象方法的实现。

要求:

1.参数的个数以及类型需要与函数接口中的抽象方法一致。 2.返回值类型要与函数接口中的抽象方法的返回值类型一致。 语法: 方法归属者 :: 方法名 静态方法的归属者为类名, 非静态方法归属者为该对象的引用。 以上面代码里面的接口,完成的示例代码
public class Test04 {
    public static void main(String[] args) {
        //无参数无返回值
        NoParamNoReturn noParamNoReturn=Test04::show;
        noParamNoReturn.method();
        //有参数无返回值
        OneParamNoReturn oneParamNoReturn = Test04::show;
        oneParamNoReturn.method(99);
        //有参数有返回值
        Test04 test04 = new Test04();
        OneParamHaveReturn oneParamHaveReturn =test04::get;
        int value = oneParamHaveReturn.method(66);
        System.out.println(value);


    }
    //静态方法
    public static void  show(){
        System.out.println("lambda表达式引用方法");
    }
    //静态方法
    public static void  show(int a){
        System.out.println("lambda表达式引用方法"+a);
    }
    //非静态方法
    public int get(int a){
        return a*10;
    }

}

Lambda表达式创建线程

因为Runnable是一个函数式接口

public class Test05 {
    public static void main(String[] args) {
        Runnable runnable=()->{
            for (int i=0;i<=10;i++){
                System.out.println("打印"+i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        };
        Thread thread = new Thread(runnable);
        thread.start();

    }
}

Lambda表达式中的闭包问题

闭包的本质就是代码片段

java中的匿名内部类也是闭包的一种实现方式

在闭包中访问外部的变量时,外部变量必须是 final 类型,虚拟机会帮我们加上 final 修饰关键字。

常用的函数式接口

Consumer接口的使用

调用集合的 public void forEach(Consumer<? super E> action) 方法,通过 lambda 表达式的方式遍历集合中的元素。
public class Test01 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("java");
        list.add("python");
        list.add("c++");
        list.add("vue");
//        list.forEach((value)->{
//            System.out.println(value);
//        });
        list.forEach(System.out::println);
    }
}

调用的是Consumer接口中的这个抽象方法void accept(T t):在给定的参数上执行此操作。

第二种打印方式:是Lambda表达式引用PrintStream类中的方法,但是由于这个print不是静态方法,所以需要PrintStream对象来绑定,这个方法与Consumer接口中的void accept(T t)抽象方法的参数个数,类型以及返回值都一致因此可以引用

public void print(String s)打印一个字符串。如果参数是 null然后串 "null"印刷。否则,该字符串的字符是根据平台的默认字符编码转换成字节,这些字节的方法完全 write(int)方式写。

Predicate接口的使用

Predicate 是 JDK 为我们提供的一个函数式接口,可以简化程序的编写。
public class Test01 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("java");
        list.add("python");
        list.add("c++");
        list.add("vue");


        list.removeIf(ele->ele.equals("java"));
        list.forEach(System.out::println);
          }
}

Comparator接口的使用

Comparator 是 JDK 为我们提供的一个函数式接口,该接口为比较器接口。
public class Test01 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("c");
        list.add("a");
        list.add("d");
        list.add("b");
        list.sort((o1,o2)->o1.compareTo(o2));
        list.forEach(System.out::println);
         }
}  

Stream流

Stream 是数据渠道,用于操作数据源所生成的元素序列,它可以实现对集合的复杂操作,例如过 滤、排序和映射等。Stream 不会改变源对象,而是返回一个新的结果集。

Stream流的生成方式

生成流:通过数据源(集合、数组等)创建一个流。 中间操作:一个流后面可以跟随零个或者多个中间操作,其目的主要是打开流,做出某种程度的数 据过滤 / 映射,然后返回一个新的流,交给下一个操作使用。 终结操作:一旦执行终止操作,就执行中间的链式操作,并产生结果。

常用方法

数据过滤
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class Test02 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("javaScript");
        list.add("python");
        list.add("java");
        list.add("mysql");
        list.add("scala");
//        数据过滤
//        多条件和的关系
        list.stream().filter(ele->ele.startsWith("j")).filter(ele->ele.endsWith("a")).collect(Collectors.toList()).forEach(System.out::println);
//        多条件或的关系
        Predicate<String> predicate = ele->ele.startsWith("j");
        Predicate<String> predicate1 = ele->ele.endsWith("a");
        list.stream().filter(predicate.or(predicate1)).collect(Collectors.toList()).forEach(System.out::println);
    }
}
数量限制

limit(long maxSize)返回一个包含该流的元素流,截断长度不超过 maxSize

public class Test03 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("javaScript");
        list.add("python");
        list.add("java");
        list.add("mysql");
        list.add("scala");
        list.stream().limit(3).forEach(System.out::println);
    }
}
数据排序
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

public class Test04 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("d");
        list.add("e");
        list.add("c");
        list.add("s");
        list.add("a");
//        第一种方式升序
        list.stream().sorted().forEach(System.out::print);
        System.out.println();
        System.out.println("=========================");
//        第二种升序方式
        list.stream().sorted(Comparator.naturalOrder()).forEach(System.out::print);
        System.out.println();
        System.out.println("=======================");
//        降序方式
        list.stream().sorted(Comparator.reverseOrder()).forEach(System.out::print);
        System.out.println();
        System.out.println("=======================");
    }
}

标签:java,函数,编程,list,System,接口,println,返回值,out
From: https://blog.csdn.net/qq_74947724/article/details/142854666

相关文章

  • YOLOv8改进 | Conv篇 | 2024最新Kolmogorov-Arnold网络架构下的KANConv(包含九种不同类
    一、本文介绍本文给大家带来的改进机制是2024最新的,Kolmogorov-Arnold网络(ConvolutionalKANs),这种架构旨在将Kolmogorov-Arnold网络(KANs)的非线性激活函数整合到卷积层中,从而替代传统卷积神经网络(CNNs)的线性变换。与标准的卷积神经网络(CNN)相比,KANConv层引入了更多的参数,因......
  • 实验2 类和对象_基础编程1
    任务1: t.h#pragmaonce#include<string>classT{public:  T(intx=0,inty=0);   T(constT&t);   T(T&&t);    ~T();      voidadjust(intratio);    voiddisplay()const;     private:  intm1,m2;public:......
  • 2024HIT哈工大计算机网络实验(详细注释、Java代码实现)
    点此去往代码仓库,持续更新实验内容HIT计算机网络实验大部分好像都是用的C/C++代码,网上找很少看到Java的代码,或者不是很详细,所以我自己总结了一下发在了Github上,有详细注释和内容解释,还有一些写代码时的错误以及找错误的心路历程。如果能够对你有所帮助,麻烦点一点star谢谢啦......
  • java ConcurrentHashMap源码分析
    目录一、一些重要属性常量sizeCtl属性Node类TreeNode类TreeBin类ForwardingNode类二、Unsafe类方法三、构造方法无参构造方法带参构造方法四、put()方法大致分析具体分析1.第一阶段spread()方法initTable()方法2.第二阶段helpTransfer()方法3.第三阶段tr......
  • CUDA编程学习 (3)——内存和数据定位
    1.CUDAMemories1.1GPU性能如何所有thread都会访问globalmemory,以获取输入的矩阵元素在执行一次浮点加法时,需要进行一次内存访问,每次访问传输4字节(即32位浮点数)1FLOP(浮点运算)对应4字节的内存带宽假设的GPU性能:该GPU的峰值浮点计算能力为1,600GFL......
  • CUDA编程学习 (4)——thread执行效率
    1.Warp和SIMD硬件1.1作为调度单位的Warp每个block分为32-threadwarp在CUDA编程模型中,虽然warp不是显式编程的一部分,但在硬件实现上,每个block会被自动划分成若干个包含32个线程的warp。warp作为SM中的调度单元:SM(StreamingMultiprocessor)会以warp......
  • 【Java基础】Pack200
    前言pack200是一个用于Java的工具,主要用于将Java应用程序的JAR文件进行压缩和打包,从而减小其体积。pack200可以有效地减少JAR文件的大小,并且可以在需要时进行解压缩。一、Pack200使用举例1.压缩JAR文件pack200--repackyourfile.packyourfile.jaryourfile.p......
  • ts 构造函数类型和构造函数返回值类型的区别
    在TypeScript中,构造函数类型和构造函数返回值类型是两个不同的概念,它们分别用于描述构造函数的行为和结果。下面详细解释这两者的区别。1.构造函数类型构造函数类型描述的是一个类的构造函数的签名,包括构造函数的参数类型和返回类型。它定义了如何通过new关键字创建一个实......
  • 用Greenfoot(Java语言教程)编写记忆卡牌游戏【1】
    第一部分先编写出场景Like:1.首先先在World和Actor新建子类。打开游戏文档,找到images拖入图片,在Table和Card在导入你的卡牌图片,成功后如下图。2.然后打开Table和Card编译器,输出以下代码输入后应该如开头所示,因为没有输入翻牌代码所以无法游玩,但整体框架已经完成。......
  • 【数据结构与算法】《Java 算法宝典:探秘从排序到回溯的奇妙世界》
    目录标题:《Java算法宝典:探秘从排序到回溯的奇妙世界》一、排序算法1、冒泡排序2、选择排序3、插入排序4、快速排序5、归并排序二、查找算法1、线性查找2、二分查找三、递归算法四、动态规划五、图算法1.深度优先搜索(DFS)2.广度优先搜索(BFS)六、贪心算法七、分治算法......