java.util.function.Function的用法

JDK 1.8 API包含了很多内建的函数式接口,在老Java中常用到的比如Comparator或者Runnable接口,这些接口都增加了@FunctionalInterface注解以便能用在lambda上。现如今,我们则从Function常用函数入口,真正了解一下。

nametypedescription
ConsumerConsumer< T >接收T对象,不返回值
PredicatePredicate< T >接收T对象并返回boolean
FunctionFunction< T, R >接收T对象,返回R对象
SupplierSupplier< T >提供T对象(例如工厂),不接收值
UnaryOperatorUnaryOperator接收T对象,返回T对象
BinaryOperatorBinaryOperator接收两个T对象,返回T对象

标注为FunctionalInterface的接口被称为函数式接口,该接口只能有一个自定义方法,但是可以包括从object类继承而来的方法。如果一个接口只有一个方法,则编译器会认为这就是一个函数式接口。是否是一个函数式接口,需要注意的有以下几点:

该注解只能标记在”有且仅有一个抽象方法”的接口上。

JDK8接口中的静态方法和默认方法,都不算是抽象方法。

接口默认继承java.lang.Object,所以如果接口显示声明覆盖了Object中方法,那么也不算抽象方法。
该注解不是必须的,如果一个接口符合”函数式接口”定义,那么加不加该注解都没有影响。加上该注解能够更好地让编译器进行检查。如果编写的不是函数式接口,但是加上了@FunctionInterface,那么编译器会报错。
在一个接口中定义两个自定义的方法,就会产生Invalid ‘@FunctionalInterface’ annotation; FunctionalInterfaceTest is not a functional interface错误.
Function常用方法&&实践

//将Function对象应用到输入的参数上,然后返回计算结果。

R apply(T t);

例子1,先来个简单版的:传String,返回String。

package org.dreams.transaction;import java.util.function.Function;public class FunctionTest<In, Out> {private Function<In, Out> processor = new Function<In, Out>() {@Overridepublic Out apply(In in) {return (Out) new String("apply:" + in);}};public static void main(String[] args) {FunctionTest<String, String> functionTest = new FunctionTest();System.out.println(functionTest.processor.apply("hello~!"));}
}
lambda表达式的写法:package org.dreams.transaction;import java.util.function.Function;public class FunctionTest<In, Out> {private Function<In, Out> processor = in -> {return (Out) new String("apply:" + in);};public static void main(String[] args) {FunctionTest<String, String> functionTest = new FunctionTest();System.out.println(functionTest.processor.apply("hello~!"));}
}

例子二:
andThen方法

//返回一个先执行当前函数对象apply方法再执行after函数对象apply方法的函数对象。
default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {Objects.requireNonNull(after);return (T t) -> after.apply(apply(t));}

compose方法

//返回一个先执行before函数对象apply方法再执行当前函数对象apply方法的函数对象
default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {Objects.requireNonNull(before);return (V v) -> apply(before.apply(v));}

完整代码

package org.dreams.transaction.java8;import java.util.function.Function;public class Function2Test{public static void main(String[] args) {Function<Integer, Integer> name = e -> e * 2;Function<Integer, Integer> square = e -> e * e;int value = name.andThen(square).apply(3);System.out.println("andThen value=" + value);int value2 = name.compose(square).apply(3);System.out.println("compose value2=" + value2);//返回一个执行了apply()方法之后只会返回输入参数的函数对象Object identity = Function.identity().apply("huohuo");System.out.println(identity);}
}

返回结果

andThen value=36
compose value2=18
huohuo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555915.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql服务器程序_MySQL服务器

1、安装通常系统在成功安装之后就已经自带MySQL服务器以及客户端了。查询MySQL及其相关文件是否安装&#xff1a;rpm -qa | grep perlrpm -qa | grep mysql如果没有安装&#xff0c;则可以使用yum进行安装&#xff1a;yum -y install perl-DBIyum -y install perl-DBD-MySQLyum…

Java中List的contains方法,你用对了吗?

Java语言中的List是我们处理集合时经常会用到的。而List定义了一个contains方法&#xff0c;用以判断一个集合中是否包含指定的一个对象。 大家应该有用到过吧&#xff0c;可是你真的会用&#xff0c;用对了吗&#xff1f; 看看下面的代码。 上图代码中&#xff0c;创建了两个…

mysql sql in or 替换_sql IN 的用法一例--替换 mysql longtext字段中某些内容的用法

之前给改版的一个学校里的站点突然提出要求&#xff0c;说需要将之前编辑的文章的字体大小全部改成默认值。字体的控制无非有两种&#xff0c;一是font-size 16 px&#xff1b;然后是。但是&#xff0c;之前发布的文章&#xff0c;文字的控制是由编辑器生成的&#xff0c;而根…

List的contains方法使用

List的contains方法用于判断对象是否存在于列表中。 举例说明&#xff1a; 这里简单的创建一个User类&#xff1a; public class User {private String id;private String name;private String phone;private String address;//忽略getters和setters }在main方法中创建3个User…

mysql初体验学习笔记_【MySQL】mycli初体验

早就听说mycli很好用&#xff0c;今天打算在本地测试机上装一下体验一把。安装方法很是简单&#xff1a;一、安装依赖&#xff1a;yum install python-pip python-devel二、安装myclipip install mycli这样就安装完了。三、使用方法[rootlocalhost .pip]# mycli --helpUsage: m…

ArrayList类contains方法实现原理

以ArrayList集合示例 思考&#xff1a;contains方法如何执行&#xff1f; public static void main(String [] args){List<String> listnew ArrayList<String>(); list.add("张三"); System.out.println(list.contains("张三"); }分析contai…

mysql索引结构优缺点_mysql索引优缺点及注意事项

优点有了索引.对于记录数量很多的表,可以提高查询速度.缺点索引是占用空间的.索引会影响update insert delete速度ALERT!!!1 索引要创建在where和join用到的字段上.2 以下操作符号可以应用索引&#xff1a;&#xff0c;>&#xff0c;BETWEEN&#xff0c;IN&#xff0c…

Mybatis源码分析之(五)mapper如何将数据库数据转换成java对象的

本篇对mybatis从取到数据库数据开始到映射成对象并返回的过程进行了详细的分析。 转换ResultSet成java对象 下面的代码是PreparedStatementHandler中的 Overridepublic <E> Cursor<E> queryCursor(Statement statement) throws SQLException {PreparedStatement …

Java Stream Collectors.groupingBy()实现分组(单字段分组,多字段分组)

1 User实体类 public class User {private Long userId;/*** 用户名(登录)*/private String username;/*** 年龄*/private int age;/*** 性别*/private int sex;/*** 密码*/private String password; }2 单字段分组 //根据年龄分组 List<User> userList new ArrayList…

怎么在mysql查询自己建的表格_oracle数据库中怎么查询自己建的表

select * from user_tables where table_nameABC;可以查询出ABC但前提得是知道表名是ABC 可以根据表建时间不同&#xff0c;来将你本人建的表和数据库自动建的表分开&#xff0c;虽然他们都是同一个用户建的。 在user_table表里没有建表时间这一字段&#xff0c;可以用user_obj…

设计模式总结篇(为什么要学习设计模式,学习设计模式的好处)

在学习完设计模式后&#xff0c;LZ想告诉大家&#xff1a; ​ 对于一名工作不久的程序员来说&#xff0c;学习设计模式是非常有必要的&#xff0c;设计模式可以让你知道在某些场景下如何来设计出适合场景的架子&#xff0c;对&#xff0c;因为经验不丰富&#xff0c;大部分程序…

Mybatis源码分析开篇

Mybatis的由来 iBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code&#xff0c;并且改名为MyBatis 。2013年11月迁移到Github。 iBATIS一词来源于“internet”和“abatis”的组合&#xff0c;是一个基于Java的持久层框架…

java数据库配置_java--数据库(文件配置连接,自定义连接池)

import java.util.ResourceBundle;public class Mtest7Demo {//使用properties配置文件完成数据库的连接/** 开发中获得连接的4个参数(驱动,URL,用户名,密码)通常都存在配置文件中&#xff0c;方便后期维护&#xff0c;* 程序如果需要更换数据库&#xff0c;只需要修改配置文件…

Mybatis源码分析之(一)搭建一个mybatis框架(写一个mybatis的Demo)

数据库工作&#xff1a; 首先准备工作&#xff0c;安装mysql&#xff0c;并且新建一张t_demo表 CREATE TABLE t_demo (name varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,id int(11) NOT NULL AUTO_INCREMENT,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT4 DEFAUL…

后端开发 java_Java后端开发三年,你不得不了解的JVM

JAVA程序员&#xff0c;三年是个坎&#xff0c;如果过了三年你还没有去研究JVM的话&#xff0c;那么你这个程序员只能是板砖的工具了。下面来个JVM的解析可好&#xff1f;JVM是Java Virtual Machine(Java虚拟机)的缩写&#xff0c;也就是指的JVM虚拟机&#xff0c;属于是一种虚…

Mybatis源码分析之(二)根据配置文件创建SqlSessionFactory(Configuration的创建过程)

SqlSessionFactoryBuilder.build创建SqlSessionFactory&#xff08;粗略走一步流程&#xff09; 看完上篇文章后&#xff0c;你对mybatis应该有个大概的了解了&#xff0c;那么我们知道new SqlSessionFactoryBuilder().build是框架的入口&#xff0c;我们到SqlSessionFactoryB…

c++调用python接口作用是_利用Boost::Python实现C++调用python接口

利用Boost::Python实现C调用python接口2019年11月06日阅读数&#xff1a;7这篇文章主要向大家介绍利用Boost::Python实现C调用python接口,主要内容包括基础应用、实用技巧、原理机制等方面&#xff0c;希望对大家有所帮助。Boost.Python能将C的结构体暴露给Python使用。可是在运…

Mybatis源码分析之(三)mapper接口底层原理(为什么不用写方法体就能访问到数据库)

mybatis是怎么拿sqlSession 在 上一篇的时候&#xff0c;我们的SqlSessionFactoryBuilder已经从xml文件中解析出了Configuration并且返回了sessionFactory。 然后我们要从session;中拿到sqlSession public class DefaultSqlSessionFactory implements SqlSessionFactory {pr…

java中的位移_Java中的位移运算

在Java中&#xff0c;位移运算属于基本运算&#xff0c;符号是<>&#xff0c;即向左位移和向右位移。在Java中只有整数才能位移&#xff0c;所以其他的不考虑&#xff0c;位移运算是将整数在内存中表示的二进制进行位移&#xff0c;所以在Java中分为正数和负数的位移。对…

Mybatis源码分析之(四)mapper访问数据库的底层原理(代理方法中具体访问数据库的细节)

从之前的文章&#xff0c;我们知道了其实mapper真正执行的方法就下面的最后两行。&#xff08;以下所有的分析都基于一次mybatis的一次select查询。 MapperProxy类中的invoke函数 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {try {i…