当前位置:首页 > 科技  > 软件

Java的函数式接口编程示例

来源: 责编: 时间:2024-02-29 14:41:06 111观看
导读背景函数式接口是在Java 8中引入的,与Lambda表达式和方法引用一起。这三个特性被添加到Java中,以促进函数式编程并编写干净、可读的代码。在Java 8之前,需要编写大量样板代码来涵盖基本功能。例如,为了调用一个函数,首先我

SCj28资讯网——每日最新资讯28at.com

背景

函数式接口是在Java 8中引入的,与Lambda表达式和方法引用一起。这三个特性被添加到Java中,以促进函数式编程并编写干净、可读的代码。在Java 8之前,需要编写大量样板代码来涵盖基本功能。例如,为了调用一个函数,首先我们必须创建一个具有所需方法的类,创建类的实例,然后使用实例来调用方法,或者使用具有相应方法的匿名类的另一种方式。SCj28资讯网——每日最新资讯28at.com

使用Lambda表达式,我们可以避免使用具体类和匿名类对象的需求。函数式接口更进一步,因为Lambda表达式只需要实现一个方法,所以可以轻松地实现函数式接口。SCj28资讯网——每日最新资讯28at.com

函数式接口只展示一个功能。例如,一个具有单一方法compareTo()的Comparable接口用于比较目的。但它可以有任意数量的默认方法和静态方法。SCj28资讯网——每日最新资讯28at.com

Java 8定义了许多函数式接口,可以广泛用于Lambda表达式。以下是在java.util.Function包中定义的函数式接口列表。SCj28资讯网——每日最新资讯28at.com

@FunctionalInterface注解,按照功能,任何具有单个抽象方法的接口都是函数式接口。Java提供了@FunctionalInterface注解,以将一个接口标记为函数式接口,以便编译器可以检查接口是否是函数式接口。此注解是可选的,主要是为了增加编译器的检查和增加代码的可读性和维护性。SCj28资讯网——每日最新资讯28at.com

函数式接口编程示例

函数式接口的类型:在Java中,主要有四种类型的函数式接口。SCj28资讯网——每日最新资讯28at.com

Predicate函数式接口:Predicate函数式接口是一种方法接受一个参数,并返回true或false的接口。Predicate函数式接口主要用于比较元素以进行排序或根据应用于传入的输入的某些条件来过滤值。Java提供了用于基本类型的Predicate函数式接口,如IntPredicate、DoublePredicate和LongPredicate,分别只接受Integer、Double和Long类型的参数。SCj28资讯网——每日最新资讯28at.com

用法

Predicate predicate = (value) -> value != 0; //或者Predicate predicate = (value) -> test(value);

在上面的代码片段中,predicate函数根据传入的值返回true或false。SCj28资讯网——每日最新资讯28at.com

示例:

在这个例子中,我们使用predicate函数式接口和lambda表达式来从一个整数列表中过滤出奇数。SCj28资讯网——每日最新资讯28at.com

import java.util.Arrays;import java.util.List;import java.util.function.Predicate;public class Tester {   public static void main(String args[]) {      List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8);      Predicate<Integer> isEvenNumber = n -> n %2 == 0;      numbers =  numbers.stream().filter(isEvenNumber).toList();      System.out.println(numbers);   }}

编译运行上述程序后,输出结果为:SCj28资讯网——每日最新资讯28at.com

[2, 4, 6, 8]

Consumer函数式接口:Consumer函数式接口是一种方法接受一个参数,并且不返回任何值的接口。Consumer函数式接口主要用于执行副作用操作。例如,打印一个元素、添加称谓等。还有其他变种的Consumer,比如BiConsumer。BiConsumer函数式接口可以接受两个参数。Java提供了用于基本类型的Consumer函数式接口,如IntConsumer、DoubleConsumer和LongConsumer,分别只接受Integer、Double和Long类型的参数。SCj28资讯网——每日最新资讯28at.com

用法:

//定义Consumer consumer = (value) -> System.out.println(value);// 或者Consumer consumer1 = System.out::println;// 使用Consumer consumer2 = (value) -> accept(value);

示例:

在这个例子中,我们借助lambda表达式和方法引用,使用consumer函数式接口来打印整数列表中的所有数字。SCj28资讯网——每日最新资讯28at.com

import java.util.Arrays;import java.util.List;import java.util.function.Consumer;public class Tester {   public static void main(String args[]) {      List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8);      Consumer<Integer> consumer = (value) -> System.out.println(value);      Consumer consumer1 = System.out::println;      System.out.println("Printing using consumer functional interface as lambda expression");      numbers.forEach(consumer);      System.out.println("Printing using consumer functional interface as method reference");      numbers.forEach(consumer1);   }}

编译运行程序结果如下:SCj28资讯网——每日最新资讯28at.com

Printing using consumer functional interface as lambda expression12345678Printing using consumer functional interface as method reference12345678

Supplier函数式接口:Supplier函数式接口是一种没有任何参数传递且会返回一个值的接口。Supplier函数式接口主要用于延迟生成值。例如,获取一个随机数,生成一系列数字等。SCj28资讯网——每日最新资讯28at.com

用法:

//定义Supplier supplier = () -> Math.random() * 10;// 使用Supplier supplier1 = () -> get();

示例:

在这个例子中,我们借助lambda表达式,使用Supplier函数式接口来获取一个随机数。SCj28资讯网——每日最新资讯28at.com

import java.util.ArrayList;import java.util.List;import java.util.function.Supplier;public class Tester {   public static void main(String args[]) {      Supplier<Integer> supplier = () -> (int)(Math.random() * 10);      List<Integer> randomNumbers = new ArrayList<>();      // generate 10 random numbers      for(int i = 0; i< 10; i++) {         randomNumbers.add(supplier.get());      }      System.out.println(randomNumbers);   }}

编译并运行程序,得出运行结果:SCj28资讯网——每日最新资讯28at.com

[0, 8, 8, 8, 8, 5, 7, 5, 5, 9]

Function函数式接口:Function函数式接口是一种方法接受一个参数并返回一个值的接口。Function函数式接口主要用于获取处理后的值。例如,获取一个元素的平方,修剪字符串值等。还有其他的Function变体,比如BiFunction。BiFunction函数式接口可以接受两个参数。Java还提供了针对基本类型的Function函数式接口,如IntFunction、DoubleFunction和LongFunction,分别只接受Integer、Double和Long类型的参数。还有两个更实用的接口,UnaryOperator扩展了Function接口,BinaryOperator扩展了BiFunction接口。SCj28资讯网——每日最新资讯28at.com

用法:

//定义Function function = (value) -> Math.random() * 10;// 使用Function function1 = (value) -> apply(value);

示例:

在这个例子中,我们借助lambda表达式,使用Function函数式接口来获取一个平方数。SCj28资讯网——每日最新资讯28at.com

import java.util.Arrays;import java.util.List;import java.util.function.Function;public class Tester {   public static void main(String args[]) {      List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8);      Function<Integer, Integer> squared = (value) -> value * value;        List<Integer> squaredNumbers =  numbers.stream().map(squared).toList();      System.out.println(squaredNumbers);   }}

编译并运行程序,得出运行结果:SCj28资讯网——每日最新资讯28at.com

[1, 4, 9, 16, 25, 36, 49, 64]

注意事项:

在Java 8之前,已经存在的许多接口被注释为函数式接口,并可以在lambda表达式中使用。例如:SCj28资讯网——每日最新资讯28at.com

  • Runnable −提供run() 方法
  • Callable − 提供 call() 方法
  • Actionlistener − 提供actionPerformed() 方法
  • Comparable − 提供 compareTo() 方法比较两个数的大小

示例:

在这个例子中,我们创建了两个线程。第一个线程使用匿名类创建,第二个线程使用lambda表达式创建。两者都使用runnable接口来创建线程实例。SCj28资讯网——每日最新资讯28at.com

public class Tester {   public static void main(String args[]) {      // create anonymous inner class object      new Thread(new Runnable() {         @Override public void run() {            System.out.println("Thread 1 is running");         }      }).start();      // lambda expression to create the object      new Thread(() -> {         System.out.println("Thread 2 is running.");      }).start();      }}

编译并运行程序,结果:SCj28资讯网——每日最新资讯28at.com

Thread 1 is runningThread 2 is running.

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-75320-0.htmlJava的函数式接口编程示例

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 前端视角对Rust的浅析

下一篇: 一个超冷门的 Vue3 内置组件,帮我优化了66%的性能!

标签:
  • 热门焦点
  • MIX Fold3包装盒泄露 新机本月登场

    MIX Fold3包装盒泄露 新机本月登场

    小米的全新折叠屏旗舰MIX Fold3将于本月发布,近日该机的真机包装盒在网上泄露。从图上来看,新的MIX Fold3包装盒在外观设计方面延续了之前的方案,变化不大,这也是目前小米旗舰
  • 影音体验是真的强 简单聊聊iQOO Pad

    影音体验是真的强 简单聊聊iQOO Pad

    大公司的好处就是产品线丰富,非常细分化的东西也能给你做出来,例如早先我们看到了新的vivo Pad2,之后我们又在iQOO Neo8 Pro的发布会上看到了iQOO的首款平板产品iQOO Pad。虽
  • 三言两语说透设计模式的艺术-单例模式

    三言两语说透设计模式的艺术-单例模式

    写在前面单例模式是一种常用的软件设计模式,它所创建的对象只有一个实例,且该实例易于被外界访问。单例对象由于只有一个实例,所以它可以方便地被系统中的其他对象共享,从而减少
  • 自动化在DevOps中的力量:简化软件开发和交付

    自动化在DevOps中的力量:简化软件开发和交付

    自动化在DevOps中扮演着重要角色,它提升了DevOps的效能。通过自动化工具和方法,DevOps团队可以实现以下目标:消除手动和重复性任务。简化流程。在整个软件开发生命周期中实现更
  • 一文掌握 Golang 模糊测试(Fuzz Testing)

    一文掌握 Golang 模糊测试(Fuzz Testing)

    模糊测试(Fuzz Testing)模糊测试(Fuzz Testing)是通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。可以用来发现应用程序、操作系统和网络协议等中的漏洞或
  • 腾讯盖楼,字节拆墙

    腾讯盖楼,字节拆墙

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之&ldquo;想重温暴刷深渊、30+技能搭配暴搓到爽的游戏体验吗?一起上晶核,即刻暴打!&rdquo;曾凭借直播腾讯旗下代理格斗游戏《DNF》一
  • OPPO、vivo、小米等国内厂商Q2在印度智能手机市场份额依旧高达55%

    OPPO、vivo、小米等国内厂商Q2在印度智能手机市场份额依旧高达55%

    7月20日消息,据外媒报道,研究机构的报告显示,在全球智能手机出货量同比仍在下滑的大背景下,印度这一有潜力的市场也未能幸免,出货量同比也有下滑,多家厂
  • iQOO 11S或7月上市:搭载“鸡血版”骁龙8Gen2 史上最强5G Soc

    iQOO 11S或7月上市:搭载“鸡血版”骁龙8Gen2 史上最强5G Soc

    去年底,iQOO推出了“电竞旗舰”iQOO 11系列,作为一款性能强机,iQOO 11不仅全球首发2K 144Hz E6全感屏,搭载了第二代骁龙8平台及144Hz电竞屏,同时在快充
  • 苹果140W USB-C充电器:采用氮化镓技术

    苹果140W USB-C充电器:采用氮化镓技术

    据10 月 30 日 9to5 Mac 消息报道,当苹果推出新的 MacBook Pro 2021 时,该公司还推出了新的 140W USB-C 充电器,附赠在 MacBook Pro 16 英寸机型的盒子里,也支
Top
Baidu
map