Java 8 Function 函数接口
未读代码
共 8238字,需浏览 17分钟
· 2021-07-27
封面图:绍兴 · 三味书屋(2021-07-10)
在 Java 8 中,Function 接口是一个函数接口,它位于包 java.util.function
下。Function
接口中定义了一个 R apply(T t)
方法,它可以接受一个泛型 T 对象,返回一个泛型 R 对象,即参数类型和返回类型可以不同。
Function 接口源码:
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
Objects.requireNonNull(before);
return (V v) -> apply(before.apply(v));
}
default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
Objects.requireNonNull(after);
return (T t) -> after.apply(apply(t));
}
static <T> Function<T, T> identity() {
return t -> t;
}
}
1. Function apply
示例 1:输入一个字符串 <T> String
, 返回字符串的大写形式 <R> String
。
package com.wdbyte;
import java.util.function.Function;
public class Java8Function {
public static void main(String[] args) {
Function<String, String> toUpperCase = str -> str.toUpperCase();
String result = toUpperCase.apply("www.wdbyte.com");
System.out.println(result);
}
}
输出结果:
WWW.WDBYTE.COM
示例 2:输入一个字符串 <T> String
,返回字符串的长度 <R> Integer
。
package com.wdbyte;
import java.util.function.Function;
public class Java8FunctionLength {
public static void main(String[] args) {
Function<String, Integer> lengthFunction = str -> str.length();
Integer length = lengthFunction.apply("www.wdbyte.com");
System.out.println(length);
}
}
输出结果:
14
2. Function andThen
Function 函数接口的 andThen()
方法可以让多个 Function 函数连接使用。
示例:输入一个字符串,获取字符串的长度,然后乘上 2。
package com.wdbyte;
import java.util.function.Function;
public class Java8FunctionAndThen {
public static void main(String[] args) {
Function<String, Integer> lengthFunction = str -> str.length();
Function<Integer, Integer> doubleFunction = length -> length * 2;
Integer doubleLength = lengthFunction.andThen(doubleFunction).apply("www.wdbyte.com");
System.out.println(doubleLength);
}
}
结果:
28
3. List -> Map
示例:输入一个字符串 List 集合<T> List<String>
, 返回一个 key 为字符串本身,Value 为字符串长度的 Map
。
package com.wdbyte;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
public class Java8FunctionListToMap {
public static void main(String[] args) {
List<String> list = Arrays.asList("java", "nodejs", "wdbyte.com");
// lambda 方式
Function<String, Integer> lengthFunction = str -> str.length();
Map<String, Integer> listToMap = listToMap(list, lengthFunction);
System.out.println(listToMap);
// 方法引用方式
Map<String, Integer> listToMap2 = listToMap(list, String::length);
System.out.println(listToMap2);
}
public static <T, R> Map<T, R> listToMap(List<T> list, Function<T, R> function) {
HashMap<T, R> hashMap = new HashMap<>();
for (T t : list) {
hashMap.put(t, function.apply(t));
}
return hashMap;
}
}
输出结果:
{java=4, wdbyte.com=10, nodejs=6}
{java=4, wdbyte.com=10, nodejs=6}
4. List -> List<Other>
示例 :输入一个字符串 List
集合 <T> List<String>
,返回大写形式的字符串 List
集合,返回小写形式的字符串 List
集合。
package com.wdbyte;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
public class Java8FunctionString {
public static void main(String[] args) {
List<String> list = Arrays.asList("Java", "Nodejs", "Wdbyte.com");
// 方法引用方式
List<String> upperList = map(list, String::toUpperCase);
List<String> lowerList = map(list, String::toLowerCase);
System.out.println(upperList);
System.out.println(lowerList);
// Lambda 方式
List<String> upperList2 = map(list, x -> x.toUpperCase());
List<String> lowerList2 = map(list, x -> x.toLowerCase());
System.out.println(upperList2);
System.out.println(lowerList2);
}
public static <T, R> List<R> map(List<T> list, Function<T, R> function) {
List<R> resultList = new ArrayList<>(list.size());
for (T t : list) {
resultList.add(function.apply(t));
}
return resultList;
}
}
输出结果:
[JAVA, NODEJS, WDBYTE.COM]
[java, nodejs, wdbyte.com]
[JAVA, NODEJS, WDBYTE.COM]
[java, nodejs, wdbyte.com]
扩展阅读
评论
豆瓣9.7,这部Java神作第3版重磅上市!
文末赠书Java 程序员们开年就有重磅好消息,《Effective Java 中文版(原书第 3 版)》要上市啦!该书的第1版出版于 2001 年,当时就在业界流传开来,受到广泛赞誉。时至今日,已热销近20年,本书第 3 版已是 Java 程序员的必读神书,被誉为“Java 四大名著之一”,甚至连
编码之外
0
大量 Java 开源项目停更...
点击关注公众号,Java 干货及时推送↓推荐阅读:投了 100 多份简历后…出品 | OSC开源社区(ID:oschina2013)Sonatype 发布了最新的一份《软件供应链状况》报告,深入探讨了如何在充满选择的世界中定义更好的软件,并探讨人工智能 (AI) 对软件开发的深远
Java技术栈
0
接口响应慢?那是你没用 CompletableFuture 来优化!
来源:blog.csdn.net/qq_43372633/article/details/130814200👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目 2.0
小哈学Java
3
Java 神作,必读!
Java 程序员们开年就有重磅好消息,《Effective Java 中文版(原书第 3 版)》要上市啦!该书的第1版出版于 2001 年,当时就在业界流传开来,受到广泛赞誉。时至今日,已热销近20年,本书第 3 版已是 Java 程序员的必读神书,被誉为“Java 四大名著之一”,甚至连 Java
小哈学Java
0
1000Mbps换算成MB/s是多少?除以8?想简单了!
原文链接:https://post.smzdm.com/p/azoqenzp/在网络传输的时候,往往会用到Mbps这个单位,GbE or 1 GigE 的网卡现在很流行,这个东西被大家叫做“千兆网卡”。同时,大家特别习惯用GB或者MB来描述一个磁盘的大小。这个叫做Gigabyte或者Megabyte
测试开发技术
0
Java与lua互相调用简单教程
来源:网络👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目 2.0 版本完结啦, 演示链接:http://116.62.199.48/ ,新项目
小哈学Java
0
【送书福利】《Java面试八股文:高频面试题与求职攻略一本通》
先来唠唠最近粉丝面试回来跟我聊天,基本上都提到一个点,在面试过程中八股文占比很高(八股文70%、项目20%、10%算法)除了一些搞算法突出的厂除外。其实现在很多厂八股都是逐渐深入的方式来问,所以大家在学习的过程中,针对一些重点的内容,最好深入去学习,不然还是比较难应对这种追问式的问题。最近刚好从一位
Java后端技术
0
Java项目实战——打造一款股票区间交易盯盘系统
点击上方“Java进阶学习交流”,进行关注后台回复“Java”即可获赠Java学习资料今日鸡汤身无彩凤双飞翼,心有灵犀一点通。一、简介大家好,我是Snowball。今天给大家分享的内容是基于Java编程,实现股票交易相关功能开发,如果读者对股票或金融衍生物交易不太了解,又比较感兴趣的话可自行查询相关
Java进阶学习交流
0