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

Java的函数式接口编程示例

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

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

背景

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

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

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

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

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

函数式接口编程示例

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

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

用法

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

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

示例:

在这个例子中,我们使用predicate函数式接口和lambda表达式来从一个整数列表中过滤出奇数。WYo28资讯网——每日最新资讯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);   }}

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

[2, 4, 6, 8]

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

用法:

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

示例:

在这个例子中,我们借助lambda表达式和方法引用,使用consumer函数式接口来打印整数列表中的所有数字。WYo28资讯网——每日最新资讯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);   }}

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

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

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

用法:

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

示例:

在这个例子中,我们借助lambda表达式,使用Supplier函数式接口来获取一个随机数。WYo28资讯网——每日最新资讯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);   }}

编译并运行程序,得出运行结果:WYo28资讯网——每日最新资讯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接口。WYo28资讯网——每日最新资讯28at.com

用法:

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

示例:

在这个例子中,我们借助lambda表达式,使用Function函数式接口来获取一个平方数。WYo28资讯网——每日最新资讯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);   }}

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

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

注意事项:

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

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

示例:

在这个例子中,我们创建了两个线程。第一个线程使用匿名类创建,第二个线程使用lambda表达式创建。两者都使用runnable接口来创建线程实例。WYo28资讯网——每日最新资讯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();      }}

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

Thread 1 is runningThread 2 is running.

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

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

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

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

标签:
  • 热门焦点
  • 对标苹果的灵动岛 华为带来实况窗功能

    继苹果的灵动岛之后,华为也在今天正式推出了“实况窗”功能。据今天鸿蒙OS 4.0的现场演示显示,华为的实况窗可以更高效的展现出实时通知,比如锁屏上就能看到外卖、打车、银行
  • 分布式系统中的CAP理论,面试必问,你理解了嘛?

    对于刚刚接触分布式系统的小伙伴们来说,一提起分布式系统,就感觉高大上,深不可测。而且看了很多书和视频还是一脸懵逼。这篇文章主要使用大白话的方式,带你理解一下分布式系统
  • 学习JavaScript的10个理由...

    作者 | Simplilearn编译 | 王瑞平当你决心学习一门语言的时候,很难选择到底应该学习哪一门,常用的语言有Python、Java、JavaScript、C/CPP、PHP、Swift、C#、Ruby、Objective-
  • 如何通过Python线程池实现异步编程?

    线程池的概念和基本原理线程池是一种并发处理机制,它可以在程序启动时创建一组线程,并将它们置于等待任务的状态。当任务到达时,线程池中的某个线程会被唤醒并执行任务,执行完任
  • 三万字盘点 Spring 九大核心基础功能

    大家好,我是三友~~今天来跟大家聊一聊Spring的9大核心基础功能。话不多说,先上目录:图片友情提示,本文过长,建议收藏,嘿嘿嘿!一、资源管理资源管理是Spring的一个核心的基础功能,不
  • 一文搞定Java NIO,以及各种奇葩流

    大家好,我是哪吒。很多朋友问我,如何才能学好IO流,对各种流的概念,云里雾里的,不求甚解。用到的时候,现百度,功能虽然实现了,但是为什么用这个?不知道。更别说效率问题了~下次再遇到,
  • 网红炒股不为了赚钱,那就是耍流氓!

    来源:首席商业评论6月26日高调宣布入市,网络名嘴大v胡锡进居然进军了股市。在一次财经媒体峰会上,几个财经圈媒体大佬就&ldquo;胡锡进炒股是否知道认真报道&rdquo;展开讨论。有
  • 华为发布HarmonyOS 4:更好玩、更流畅、更安全

    在8月4日的华为开发者大会2023(HDC.Together)大会上,HarmonyOS 4正式发布。自2019年发布以来,HarmonyOS一直以用户为中心,经历四年多的发展HarmonyOS已
  • 2299元起!iQOO Pad开启预售:性能最强天玑平板

    5月23日,iQOO如期举行了新品发布会,除了首发安卓最强旗舰处理器的iQOO Neo8系列新机外,还在发布会上推出了旗下首款平板电脑——iQOO Pad,其搭载了天玑
Top