【Java进阶】java函数式编程的使用

 

目录

1.目前Java中自带的函数式编程接口

2.java中使用函数式编程的案例

 3.自定义函数式接口

 4.自定义函数式接口的实现


 

简单一句话理解函数式编程,传统的方法调用我们都是传递参数,而函数式编程,传递的则是方法实现的过程。

1.目前Java中自带的函数式编程接口

1.线程类型

接口名返回值/方法/参数含义
Runnablevoid run()定义多线程方法内容
Callable<V>V call()有返回值的多线程方法

2.有参/无返回值 类型

接口名返回值/方法/参数含义
Consumer<T>void accept(T t)接收一个参数,不返回值
BiConsumer<T,U>

void accept(T t,U u)

接收两个参数,不返回值
ObjIntConsumer<T>void accept(T t,int value)接收一个泛型参数和一个整形参数,不返回值
ObjDoubleConsumer<T>void accept(T t,double value)接收一个泛型参数和一个双精度小数类型参数,不返回值
ObjLongConsumer<T>void accept(T t,Long value)接收一个泛型参数和一个长整型的参数,不返回值

3.无参/有返回值 类型

接口名返回值/方法/参数含义
Supplier<T>T get()不接受参数,返回一个泛型的参数
BooleanSupplierboolean getAsBoolean()不接受参数,返回一个布尔参数
还有很多,不一一列举了......

4.有参/有返回值 类型

接口名返回值/方法/参数含义
Function<T, R>R apply(T t)接收一个参数,返回另一种参数
Predicate<T>boolean test(T t)接收一个参数,返回一个布尔值
这里也还有很多,就不一一列举了.....

还有很多的函数式接口,具体可以参考java.util.function包下的内容

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASmVmZkhhbl5fXg==,size_13,color_FFFFFF,t_70,g_se,x_16

2.java中使用函数式编程的案例

1.ArrayList中的forEach方法

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASmVmZkhhbl5fXg==,size_20,color_FFFFFF,t_70,g_se,x_16

 使用一下这个方法看看

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASmVmZkhhbl5fXg==,size_18,color_FFFFFF,t_70,g_se,x_16

 打印结果:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASmVmZkhhbl5fXg==,size_13,color_FFFFFF,t_70,g_se,x_16

 这里的意思其实就是上面所说的,我们不是像传统的方法传递的是参数,传递的是一种方法的实现。从forEach的方法中不难看出,他是将List中的每一个元素放入accept的方法中的,而我们告诉了Consumer要去打印传入的每个参数。

2.再比如ArrayList中的replaceAll这个方法

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASmVmZkhhbl5fXg==,size_20,color_FFFFFF,t_70,g_se,x_16

 可以看到,这里的逻辑是将List中的值经过变换,在赋给原来的引用,所以我们传入的实现就是改变的规则,如下:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASmVmZkhhbl5fXg==,size_20,color_FFFFFF,t_70,g_se,x_16

结果:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASmVmZkhhbl5fXg==,size_13,color_FFFFFF,t_70,g_se,x_16

3.Stream流

在Java.util.stream.Stream类下,我们可以看到大部分的方法都是用函数式编程实现的。

  • Stream<T> filter(Predicate<? super T> predicate)
  • <R> Stream<R> map(Function<? super T, ? extends R> mapper)
  • IntStream mapToInt(ToIntFunction<? super T> mapper)
  • LongStream mapToLong(ToLongFunction<? super T> mapper)

简单的实现:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASmVmZkhhbl5fXg==,size_20,color_FFFFFF,t_70,g_se,x_16

这里通过少量的代码直接实现了对列表中所有的数字加10,过滤大于14的值,并组成一个新的List,并打印出来,我们来看看结果:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASmVmZkhhbl5fXg==,size_13,color_FFFFFF,t_70,g_se,x_16

 3.自定义函数式接口

自定义函数式接口需要满足个规则:

1.类型必须是接口。

2.接口里有且仅有一个抽象方法。

3.使用@FunctionalInterface标注接口。

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASmVmZkhhbl5fXg==,size_12,color_FFFFFF,t_70,g_se,x_16

 4.自定义函数式接口的实现

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASmVmZkhhbl5fXg==,size_20,color_FFFFFF,t_70,g_se,x_16

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASmVmZkhhbl5fXg==,size_13,color_FFFFFF,t_70,g_se,x_16

当然,java提供的函数式接口,已经基本满足日常开发的需求了,合理的利用函数式编程,可以统一团队的开发规范,提高代码可读性,简化代码。

 

 

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
函数式编程(FP)是一种软件开发风格,它注重不依赖于编程状态的函数。函数式代码易于测试和复用,容易实现并发,且不容易受到bug的攻击。Scala是一种能很好支持函数式编程的新兴JVM语言。《Scala函数式编程》是针对希望学习FP并将它应用于日常编码中的程序员而写的,内容包括:函数式编程的概念;函数式编程相关的各种“为什么”和“怎么做”;如何编写多核程序;练习和检测。 从OOP到FP,思路的转化 我是使用scala做完一个项目之后,开始阅读本书。 介绍下背景: 1 程序员 2 前C程序员,linux平台,没有很深的java背景 3 用scala做过一个2年期的项目 在使用scala的过程中,碰到的问题主要体现在: 1 scala的很多语法糖不理解,不知道为啥要这么写,有种为了这么写的简洁而这么写的感觉 2 scala很多库在设计的时候,不理解原因,包括Option,Collection的很多看似有冗余的地方 3 很多scala的默认写法,不理解 4 多态的具体化,尤其是协变的意义所在 5 各种重载的符号使用 之前读过 programming in scala,对语言的整体还停留在: 1 scala用起来比java更灵活 2 强大的collection,可以更加方便的处理collection类的数据 3 不同于java的并行处理方法,有点像c的逻辑思路 4 开发成本比java小,但是语言学习成本比java高很多 正在阅读这本书的过程中,只能一点一点说。 第一部分快要读完了,习题也快要做完了。 1 第一部分主要着墨点正是回答我上述问题的1,2,3的。很大篇幅都放在,使用scala实现scala默认库文件的API中,通过对简单的函数式编程逻辑的介绍和实践,主要是实践,建立起来一个比较明晰的scala思维模式,或者叫函数式编程的思维模式。 2 无副作用的函数式编程,同时也解释了为什么在scala中,val和var的区分为什么那么重要。 3 在做习题的过程中,尤其是在做类型推导的过程中,对原来oop,命令式编程向函数式编程转变有很大作用;而且简洁的语法,确实让人有享受编程的感觉。
Java 8引入了Lambda表达式和函数式接口,使得Java也可以实现函数式编程。下面是一些使用Java 8函数式编程的示例: 1. Lambda表达式 Lambda表达式是一种简洁的语法形式,可以将一个函数作为参数传递给另一个函数,或者将一个函数返回给另一个函数。下面是一个使用Lambda表达式的示例: ``` List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); numbers.forEach(number -> System.out.println(number)); ``` 上面的代码中,我们使用Lambda表达式将一个函数作为参数传递给forEach方法,该方法会将集合中的每个元素作为参数传递给Lambda表达式中的函数,并执行该函数。 2. 函数式接口 函数式接口是只有一个抽象方法的接口,可以使用Lambda表达式来实现该方法。Java 8中提供了一些函数式接口,如Predicate、Function和Consumer等。下面是一个使用Function接口的示例: ``` Function<Integer, String> converter = (number) -> Integer.toString(number); String result = converter.apply(3); System.out.println(result); ``` 上面的代码中,我们定义了一个Function接口的实现,该实现将一个整数转换为字符串。然后,我们使用该实现将整数3转换为字符串,并将结果打印出来。 3. 方法引用 方法引用是一种简洁的语法形式,可以将一个方法作为参数传递给另一个方法。Java 8中提供了一些方法引用的方式,如静态方法引用、实例方法引用和构造函数引用等。下面是一个使用方法引用的示例: ``` List<String> names = Arrays.asList("John", "Jane", "Tom"); names.forEach(System.out::println); ``` 上面的代码中,我们使用方法引用将System.out.println方法作为参数传递给forEach方法,该方法会将集合中的每个元素作为参数传递给System.out.println方法,并执行该方法。 这些都是Java 8函数式编程的基本示例,你可以根据自己的需求使用Lambda表达式、函数式接口和方法引用来编写功能强大的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JeffHan^_^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值