Java基础之四大核心函数式接口简单使用
其实为了更好的使用lamda表达式,java在jdk1.8之后也添加了内置四大核心的函数式接口。什么是函数式接口以及lambda表达式可以看前面一篇 地址
Java内置的四大核心函数式接口如下:
函数式接口 | 参数类型 | 返回值 | 意义 |
---|---|---|---|
Consumer<T> | T | void | 对类似为T的对象应用才做,包含方法void accept(T t) |
Supplier<T> | 无 | T | 返回类型为T的对象,包含方法:T get() |
Function<T,R> | R | T | 对类型为T的对象应用操作,并返回结果。结果是R的对象,包含的方法 R.apply(T t) |
Predicate<T> | T | boolean | 确定类型为T的对象是否满足某约束,并返回boolean值。包含方法:boolean test(T t) |
这四大核心的函数式接口,说白就是为何跟上其他语言的lambda表达式而诞生的,而且其可以使用方法引用(上一篇聊过)
对于这四大核心的函数式接口,简单立即就是定义了一个标准,只要实现了这个接口,按照其要求写即可。不要纠结为什么这样写,因为接口本质就是定义了一个标准而已。
Consumer<T> 消费型接口,返回值 void
这个看名字就知道式一个消费型接口
现在看源码:(后面不在黏贴,毕竟意义不大)
/** Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.*/
package java.util.function;import java.util.Objects;/*** Represents an operation that accepts a single input argument and returns no* result. Unlike most other functional interfaces, {@code Consumer} is expected* to operate via side-effects.** <p>This is a <a href="package-summary.html">functional interface</a>* whose functional method is {@link #accept(Object)}.** @param <T> the type of the input to the operation** @since 1.8*/
@FunctionalInterface
public interface Consumer<T> {/*** Performs this operation on the given argument.** @param t the input argument*/void accept(T t);/*** Returns a composed {@code Consumer} that performs, in sequence, this* operation followed by the {@code after} operation. If performing either* operation throws an exception, it is relayed to the caller of the* composed operation. If performing this operation throws an exception,* the {@code after} operation will not be performed.** @param after the operation to perform after this operation* @return a composed {@code Consumer} that performs in sequence this* operation followed by the {@code after} operation* @throws NullPointerException if {@code after} is null*/// 1 :default方法某默认实现,不属于抽象方法// 2 :接口重写了Object的公共方法也不算入内default Consumer<T> andThen(Consumer<? super T> after) {Objects.requireNonNull(after);return (T t) -> { accept(t); after.accept(t); };}
}
简单的代码演示
public class test {public static void main(String[] args) {// 写法1 传统写法Consumer<Double> consumer=new Consumer<Double>() {@Overridepublic void accept(Double num) {System.out.println("写法1 输入的数字值是:"+num);}};getName(12.3,consumer);// 写法2:lambda表达式Consumer<Double> consumer1= num-> System.out.println("写法2 输入的数字值是:"+num);getName(12.3,consumer1);// 写法3 方法引用Consumer<Double> consumer2= System.out::println; getName(12.3,consumer2);}public static void getName(Double num,Consumer<Double> consumer) {consumer.accept(num);}}
Predicate<T> 断定型接口,返回值 boolean
代码演示
public class test {public static void main(String[] args) {String[] arr= {"张国立","成龙","李连杰","张彻","张三","甄子丹"};
// 要求将数组中的名字带张的人放入一个list中
// 方法1 传统方式Predicate<String> predicate=new Predicate<String>() {@Overridepublic boolean test(String t) {if (t.contains("张")) {return true;}return false;}};getList(arr,predicate);// 方法2 lambda表达式 Predicate<String> predicate1= t->{if (t.contains("张")) {return true;}return false;};getList(arr,predicate1);// 或者结合三目运算符predicate1= t->{return t.contains("张") ? true: false;};getList(arr,predicate1);// 不过t.contains("张") 本身就返回boolen值了predicate1= t->{return t.contains("张");};// 也可以省略 return predicate1= t-> t.contains("张");getList(arr,predicate1);// 方法3 方法引用 根据前面的总结 这个方法暂时无法写}// public static public static void getList(String[] arr,Predicate<String> predicate) {List<String> zlist=new ArrayList<String>();for (String s:arr) {if(predicate.test(s)) {zlist.add(s);}}System.out.println(zlist);}}
Supplier<T>,供给型接口,返回值 T
返回一个对象。
public class test {public static void main(String[] args) {// 方法1 传统方式Supplier<String> supplier =new Supplier<String>() {@Overridepublic String get() {return "看自己需求写返回的对象";}};getString(supplier);// 方法2 lambda表达式Supplier<String> supplier1 =() -> {return "看自己需求写返回的对象";};//也可以这样写 Supplier<String> supplier1 =() -> "看自己需求写返回的对象";lambda会自动添加retrun getString(supplier1);}public static void getString(Supplier<String> supplier) {System.out.println(supplier.get());}
}
Function<T, R> 函数型接口,返回值 R
public class test{public static void main(String[] args) {ObJ obj=new ObJ("张三",12);
// 方法1 传统方式Function<ObJ, String> function=new Function<ObJ, String>() {@Overridepublic String apply(ObJ obj) {// TODO Auto-generated method stubreturn obj.getName();}};getFunc(obj,function);// 方法2 lambda表达式Function<ObJ, String> function1 = zobj-> { return zobj.getName();};//也可以这样写 Function<ObJ, String> function1 = zobj-> zobj.getName(); lambda会自动添加retrun getFunc(obj,function1);}public static void getFunc(ObJ obj, Function<ObJ, String> function) {System.out.println(function.apply(obj)); }
}class ObJ{private String name;private int age;public ObJ(String name, int age) {super();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;}}
这四个本篇只是写了几个简单应用,后面在弄一些应用场景。所以先了解使用过程。
Java基础之四大核心函数式接口简单使用相关推荐
- java自带函数_java8中内置的四大核心函数式接口
java8中内置的四大核心函数式接口 Consumer:消费型接口 void accept(T t) //Consumer 消费型接口 public void happy(double money, ...
- java8四大核心函数式接口(模拟实现,全网最通俗易懂)
前言,如果不精通lamda表达式,请观看文章https://blog.csdn.net/wwwwwww31311/article/details/113116327 一.消费者接口 经典案例代码,怎么 ...
- java 内置函数_java8 四大内置核心函数式接口
其他补充接口: 一.Consumer:消费型接口(void accept(T t)) 来看一个简单得例子: 1 /** 2 * 消费型接口Consumer 3 */ 4 @Test 5 public ...
- comparator接口_8000字长文让你彻底了解 Java 8 的 Lambda、函数式接口、Stream 用法和原理
我是风筝,公众号「古时的风筝」.一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...
- java8的4大核心函数式接口
//java8的4大核心函数式接口//1.Consumer<T>:消费性接口//需求:public void happy(double money, Consumer<Double& ...
- 面霸篇:高频 Java 基础问题(核心卷一)
JVM.JRE.JDK 关系 Java 是解释执行么? 采用字节码的好处 JDK 1.8 之后有哪些新特性 构造器是否可以重写 wait() 和 sleep 区别 &和&&的区 ...
- Java基础篇(05):函数式编程概念和应用
本文源码:GitHub·点这里 || GitEE·点这里 文章目录 一.函数式概念 二.函数与方法 三.JDK函数基础 1.Lambda表达式 2.函数式接口 四.Optional类 1.Null判断 ...
- Java新特性:Java8函数式接口与Lambda表达式(一)
摘要 何为函数式接口? 什么是lambda表达式,lambda表达式的本质: 函数式接口与lambda表达式的联系:lambda是实现函数式接口的一个快捷方式,可以作为函数式接口的一个实例: 常用Ja ...
- java中的ackerman_java8的函数式接口
函数式接口 就是在java8里允许你为一个接口(只有一个实现的,声明为FunctionalInterface注解的)实现一个匿名的对象,大叔感觉它与.net平台的委托很类似,一个方法里允许你接收一个方 ...
最新文章
- 使用runtime让button传递多个参数
- 谷歌TF2.0凌晨发布!“改变一切,力压PyTorch”
- 登录加密的前后端测试
- 清华大学《操作系统》(九):进程和线程
- 2018 年最受欢迎的15个顶级 Python 库
- 程序员面试金典——1.2原串翻转
- win10此电脑不见了_微软介绍 Win10 “重置此电脑”失败的解决方法 - 微软
- ubuntu 18.04安装php 7,如何在Ubuntu 18.04和16.04上安装PHP(7.3,7.2和7.0)?
- python所遇到的坑
- python学习笔记--Django入门二 Django 的模板系统
- Avalonia的Snoop
- 使用Vue制作幻灯片
- 《优柔有情人》读后感6000字
- NAS中的文件共享协议
- IOT-Studio 物联网应用开发实例
- Caché Global
- 爬取《斗破苍穹》小说
- form表单,账号注册实例
- RANSAC和SAC-IA
- 【论文速递】ISPRS2022 :一种新颖的结合几何语义信息的星载SAR数据三维定位方法
热门文章
- 计算机基本操作知识课本内容阅读,计算机基础知识及基本操作
- 用python可以免费下载音乐吗-使用python实现下载我们想听的歌曲,速度超快
- linux系统日志文件介绍
- C#毕业设计——基于C#+asp.net+sqlserver的学生信息管理系统设计与实现(毕业论文+程序源码)——学生信息管理系统
- Kettle 实现数据同步
- OUC2021秋-计算机网络-期末(回忆版)
- 全排列Permutation
- 基于bp的神经网络算法,bp神经网络是什么算法
- 实现对文件夹进行加密
- 局域网或外网Nexus私服下载安装仓库使用整理(Linux环境)这一篇足够