Jdk8新特性三:jdk8之函数式编程Function

文章目录

  • Jdk8新特性三:jdk8之函数式编程Function
    • Function接口的使用
    • BiFunction接口解决传入两个参数问题
    • JDK8函数式编程消费型接口Consumer\

Function接口的使用

  1. Lambda表达式必须先定义接口,创建相关方法后才能使用,这样弄十分不便,干脆开发者就直接内置了接口,所有标注@FunctionalInterface注解的接口都是函数式接口。
  2. jdk8内置的四大核心函数式接口

Consumer:消费型接口,有入参,无返回值。

​ void accept(T t);

Supplier:供给型接口:无入参,有返回值

​ T get();

Function<T,R>:函数型接口,有入参,有返回值

​ R apply(T t);

Predicate:断言型接口,有入参,有返回值,返回值类型确定是boolean

​ boolean test(T,t);

  1. Function<T,R>:传入一个值,经过函数的计算返回另一个值(T,入参类型,R:出参类型)
//这个就相当于声明了一个函数变量,和js很像,然后调用这个函数。之所以能这样写是因为
Function<Integer,Integer> func=p->{System.out.println("我是函数");return p*100;
};
func.apply(5);
  1. 如果用lambda表达式可以这样写
//也可以这样写,定义了一个函数的行为。p->p*12,因为Function本身就是一个函数式编程,可以将函数作为参数进行传递。
Function<Integer,Integer> func2=p->p*12;
System.out.println(func2.apply(5));

BiFunction接口解决传入两个参数问题

  1. 可以通过Ctrl+Shift+n查找BiFunction类。可以看到也是函数式编程。可以传入两个参数。用法和上面一个参数的一样。
System.out.println(opreator(1,2,(a,b)->a+b));
System.out.println(opreator(1,2,(a,b)->a*b));
BiFunction<Integer,Integer,Integer> bin=(a,b)->a+b;
System.out.println(bin.apply(5,10));
BiFunction<Integer,Integer,Integer> bin2=(a,b)->{System.out.println("我是bin2");return a*b;
};
System.out.println(bin2.apply(5,10));
public static Integer opreator(Integer a, Integer b, BiFunction<Integer,Integer,Integer> bf){return bf.apply(a,b);
}

JDK8函数式编程消费型接口Consumer<T>

  1. Consumer<T> 有入参,无返回值。idea中可以通过ctrl+shift+n输入Consumer.java找到源代码。没有返回值主要的应用场景打印日志,发送短信
    Consumer<String> consumer=obj->{//这里面可以写很多逻辑System.out.println(obj);System.out.println("调用短信接口发送短信,或者打印日志");};//consumer.accept("88888");sendMsg("88888",consumer);List<String> list= Arrays.asList("aaa","bbb","ccc");list.forEach(obj->{ System.out.println(obj);});
public static void sendMsg(String phone,Consumer<String> consumer){consumer.accept(phone);//consumer代表一个函数,phone是接收的参数。accept()方法表示这个函数运行这个参数。类似于开启新线程中的start()
}

Jdk8函数式编程供给型接口Supplier

  1. Supplier是供给型接口,无入参,有返回值 。也就是没有入参。
  2. 运用场景:如果项目中你需要一些实体类需要有默认值,而有些地方不需要默认值,我们如何处理呢?我们可以设计一个工厂模式,工厂对实体类生产两种产品,一个有默认值,一个没有默认值。
public static Student newStudent(){Supplier<Student> supplier=()->{Student student=new Student();student.setName("默认名称");return student;};return supplier.get();
}
  1. 这样我们只需要实例化这个newStudent就可以了。注意里面写的lambda表达式。是定义一个supplier的函数,然后在结尾supplier.get()方法进行调用,自己调用自己。
Student student=newStudent();
System.out.println(student.getName());

Jdk8函数式编程之断言型接口:Predicate

  1. Predicate:断言型接口,有入参,有返回值,返回值类型确定是boolean.T为入参类型,出参类型为Boolean
  2. 用途:接收一个参数,用于判断是否满足一定的条件,过滤数据。
public static List<String> filter(List<String> list,Predicate<String> predicate){List<String> results=new ArrayList<>();for(String str:list){if(predicate.test(str)){results.add(str);}}return results;
}
  1. 调用函数
List<String> list=Arrays.asList("difjisfj","343dfjsj","kfjsidj","34dfjs","djfsi");
System.out.println(list);
List<String> a = filter(list, (obj) -> obj.startsWith("a"));
List<String> filter2 = filter(list, (obj) -> {return obj.startsWith("3");
});
System.out.println(a);

Jdk8方法与构造函数的引用

  1. 之前调用方法操作:对象.方法,类名.方法。前面是实例方法,后面是静态方法。
  2. jdk8提供了另外一种调用方式,双冒号 ::

​ 这种调用方式,用来直接访问类和实例已经存在的方法或构造方法。可以通过方法引用,赋值给另外一个变量。

语法:

​ 左边是容器(或者类名,方法名),中间是"::",右边是相应的方法名

**静态方法:**则是ClassName::methodName

**实例方法:**则是(对象)Instance::methodName

**构造函数:**则是类名::new;

Lambda表达式的使用:

​ Function<入参1,返回类型> func= 方法引用

​ 应用:func.apply(入参);

​ BiFunction<入参1,入参2,返回类型> func=方法引用

​ 应用:func.apply(入参1,入参2);

  1. 引用静态方法作为函数传递
Function<String,Integer> fun =Integer::parseInt;
Integer apply = fun.apply("1204");
System.out.println(apply);
  1. 引用非静态方法作为函数传递
//使用双冒号::来构造非静态函数的引用
String text="你好啊!美女";
Function<Integer,String> func2=text::substring;
String apply1 = func2.apply(1);
System.out.println(apply1);
  1. 引用构造函数作为函数传递,含多个参数和单个参数,主要是通过Function<>里面的参数来识别调用的是哪个构造函数。
class User{private String name;private int age;public User() {}public User(String name) {this.name = name;}public User(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';}
}
//构造函数引用,多个参数
BiFunction<String,Integer,User> biFunction=User::new;
User user2 = biFunction.apply("张三", 1);
System.out.println(user2);Function<String,User> funct2=User::new;
User user3 = funct2.apply("张三");
System.out.println(user3);
  1. 可以作为一个函数声明,也可以将函数做为参数传递过去
sayHello(String::toUpperCase,"abcdefg");public static void sayHello(Function<String,String> func,String paramer){String result = func.apply(paramer);System.out.println(result);
}

Jdk8新特性三:jdk8之函数式编程Function相关推荐

  1. JDK8新特性(三):集合之 Stream 流式操作

    1.Stream流由来 首先我们应该知道:Stream流的出现,主要是用在集合的操作上.在我们日常的工作中,经常需要对集合中的元素进行相关操作.诸如:增加.删除.获取元素.遍历. 最典型的就是集合遍历 ...

  2. JDK8新特性(三)之常用内置函数式接口

    我们知道Lambda表达式的前提是需要有函数式接口,而Lambda使用时不关心接口名,抽象方法名,只关心抽象方法的参数列表和返回值类型,因此为了让我们使用Lambda方便,JDK8提供了大量常用的函数 ...

  3. java8新特性lambda表达式、函数式编程、方法引用和接口默认方法以及内部类访问外部变量

    一提到java是一种什么语言? 大多数人肯定异口同声的说是一门面向对象的语言,这种观点从我们开始学java就已经根深蒂固了,但是学到java8新特性函数式编程的时候,我才知道java并不是纯面向对象的 ...

  4. jdk8新特性(Lambda、Steam、函数式接口)

    JDK8新特性 JDK8新特性 Lambda表达式 函数式(Functional)接口 方法引用与构造器引用 方法引用 构造器引用 强大的 StreamAPI 创建Stream方式 Stream 的中 ...

  5. 【JavaSE之JDK8新特性】三万字详文带你了解JDK8新特性

    JDK8新特性 一.Lambda 1.1需求分析 2.Lambda表达式的初级体验 3.Lambda表达式的语法规则 3.1.Lambda练习1 3.2.Lambda表达式练习2 4.Function ...

  6. JDK8新特性之函数式接口

    转载自 JDK8新特性之函数式接口 什么是函数式接口 先来看看传统的创建线程是怎么写的 Thread t1 = new Thread(new Runnable() {@Overridepublic v ...

  7. 创建线程的第三种方式---JDK8新特性

    创建线程的第三种方式-JDK8新特性 实现Callable接口,创建线程 Runnable和Callable接口的不同 1.Callable可以返回一个类型V,而Runnable不可以,也就是说Cal ...

  8. Java面向对象程序开发——JDK8新特性

    文章目录 网络编程入门知识 JDK8新特性 Lambda表达式 以多线程为例: Lambda结合for循环: Stream流 获取一个流的2种常用的方式: 常用方法 终结方法 延迟方法 案例 网络编程 ...

  9. JDK8新特性的学习总结

    (尊重劳动成果,转载请注明出处:https://blog.csdn.net/qq_25827845/article/details/87903464冷血之心的博客) 目录 背景: 正文: Lambda ...

最新文章

  1. 汇编语言--sbb指令
  2. Geany 权限问题:Error opening file ... : permission denied.,原因及解决办法。
  3. Android中图片优化之webp使用
  4. 在场景中输出横向或纵向压缩的中文字符
  5. PXE+kickstart自动安装ubuntu14.04
  6. POJ - 3764 The xor-longest Path(字典树性质)
  7. 谷歌承诺未来三年将支付10亿美元新闻费用
  8. 程序读取计算机设备管理器中各设备的状态(启用/禁用)?(转自大富翁)
  9. LKT系列加密芯片DES加解密以及OpenSSL DES接口实现加解密
  10. 学python要什么基础-要学Python编程,需要什么样的基础呢?想找这方面工作
  11. 3.5 Java经典垃圾收集器介绍
  12. 人工智能机器视觉技术应用有哪些?
  13. 2022年fw保研经验(东南大学网安、湖南大学计科学硕、中科院沈阳自动化所,最终东南网安)
  14. Anaconda多环境python管理(创建、删除、复制环境)
  15. Python+OpenCV+dlib汽车驾驶员疲劳驾驶检测!
  16. 两直线平行交叉相乘_向量平行公式和垂直公式
  17. 程序员面试揭秘之程序员靠什么途径去美国工作?
  18. 微信小程序校园活动管理系统+后台管理系统
  19. 阿里巴巴高效的页面动画解决方案——Ant Motion Design
  20. 常用工具类(8/14)

热门文章

  1. 自然语言交流系统 phxnet团队 创新实训 项目博客 (十三)
  2. 性能测试需求分析 PV,响应时间、QPS、TPS
  3. 花狐狸股市操作系统说明书
  4. Dlib模型之驾驶员疲劳检测二(打哈欠)
  5. 新一代 PHP 框架 QeePHP 发布 - 主要特征
  6. IDEA同一个工程启动多个实例
  7. SolidWorks弯曲的波纹管制作教程
  8. 免杀手法学习(纯笔记为了方便查询基本是记录大佬链接水文)
  9. 英语口语测试软件在线,在线英语口语测试
  10. 笔记本Vista系统出现关机蓝屏然后自动重启,无法正常关机