[译]Java8的函数式接口
Java8引入了 java.util.function 包,他包含了函数式接口,具体的描述在以下api说明文档中:
函数式接口为lambda表达式和方法引用提供目标类型。每个函数式接口有一个单独的抽象方法,被称为函数式接口的函数方法,lambda表达式的参数和返回类型与之匹配或适应。
在这篇文章中,将着重介绍function包40个接口中的4个:
Predicate<T>
代表有一个参数的断言(boolean值的函数)
Predicate 接口允许我们创建一个基于给定参数并返回一个boolean值的lambda表达式。让我们创建一个Predicate来测试一个Person是否为成年人。
Predicate<Integer> isAnAdult = age -> age >= 18;
这里对于stream的filter方法的使用,让Predicate接口作为一个参数。所以我们实际上能够在stream中使用我们的Predicate接口。
Predicate<Person> isAnAdult = person -> person.getAge() >= 18;
List<Person> people = getAllPeople();
Integer numOfAdult = people.stream().filter(isAnAdult).count();
Consumer<T>
代表一个接受单个参数输入而不返回任何结果的操作。不像大多数其他的函数式接口,Customer预期是通过副作用进行操作。
Consumer<Ticket> ticketPrinter = ticket -> ticket.print();
Iterable接口带来的全新forEach方法可以将Consumer作为一个参数,让我们用forEach方法将上面创建的ticketPrinter操作组合在一个Collection上:
Consumer<Ticket> ticketPrinter = ticket -> ticket.print(); Collection<Ticket> tickets = getTicketsToPrint();
tickets.forEach(ticketPrinter);
现在,让我们简化一下代码,通过把Consumer直接放进forEach方法中:
Collection<Ticket> tickets = getTicketsToPrint();
tickets.forEach(ticket -> ticket.print());
Supplier<T>
表示结果供应
这是工厂的一种,他没有参数,只是返回给你一个结果。非常适合返回一个实例。
Supplier<TicketHandler> ticketHandlerCreator = () -> new TicketHandler();
另一种方案是使用构造方法引用。
Supplier<TicketHandler> ticketCreator = TicketHandler::new;
Function<T,R>
表示一个方法接收一个参数然后产出一个结果
让我们直接看一个例子:
Function<String,Predicate<Ticket>> ticketFor = event -> ticket -> event.equals(ticket.getName());
List<Ticket> tickets = getAllTickets();
Integer soldTicketsForCoolEvent = tickets.stream().filter(ticketFor.apply("CoolEvent")).count();
我们创建了一个以event字符串作为参数的Function,他会返回一个Predicate。参数会被传给Predicate,并与event字符串作比较。然后我们在stream中使用function去计算ticket name为"CoolEvent"的数量
*英文链接:deadCodeRising
*原创译文
[译]Java8的函数式接口的更多相关文章
- java8的函数式接口
函数式接口 就是在java8里允许你为一个接口(只有一个实现的,声明为FunctionalInterface注解的)实现一个匿名的对象,大叔感觉它与.net平台的委托很类似,一个方法里允许你接收一个方 ...
- JAVA8之函数式接口
由于JDK8已经发布一段时间了,也开始逐渐稳定,未来使用JAVA语言开发的系统会逐渐升级到JDK8,因为为了以后工作需要,我们有必要了解JAVA8的一些新的特性.JAVA8相对JAVA7最重要的一个突 ...
- Java8 Functional(函数式接口)
Functional 函数式(Functional)接口 只包含一个抽象方法的接口,称为函数式接口. 你可以通过 Lambda 表达式来创建该接口的对象.(若 Lambda 表达式抛出一个受检异常(即 ...
- java8 常用函数式接口
public static void main(String[] args) { // TODO Auto-generated method stub //函数式接口 Function<Inte ...
- 乐字节-Java8核心特性实战之函数式接口
什么时候可以使用Lambda?通常Lambda表达式是用在函数式接口上使用的.从Java8开始引入了函数式接口,其说明比较简单:函数式接口(Functional Interface)就是一个有且仅有一 ...
- java8学习之Supplier与函数式接口总结
Supplier接口: 继续学习一个新的函数式接口--Supplier,它的中文意思为供应商.提供者,下面看一下它的javadoc: 而具体的方法也是相当的简单,就是不接受任何参数,返回一个结果: 对 ...
- java代码之美(14)---Java8 函数式接口
Java8 函数式接口 之前写了有关JDK8的Lambda表达式:java代码之美(1)---Java8 Lambda 函数式接口可以理解就是为Lambda服务的,它们组合在一起可以让你的代码看去更加 ...
- java代码(14) --Java8函数式接口
Java8函数式接口 之前有关JDK8的Lambda表达式 Java代码(1)--Java8 Lambda 函数式接口可以理解就是为Lambda服务的,它们组合在一起可以让你的代码看去更加简洁 一.概 ...
- Java8的新特性--函数式接口
目录 函数式接口 什么是函数式接口 函数式接口的使用 Java8内置的四大核心函数式接口 一.Consumer:消费型接口(void accept(T t)) 二.Supplier:供给型接口(T g ...
随机推荐
- 使用ValueOperations操作redis
方法 c参数 s说明 void set(K key, V value); key :字段key value:key对应的值 设置一个key和value void set(K key, V v ...
- 持久化ORM框架——Hibernate与mybatis
最初SUN公司推出了JavaEE服务器端组件模型(EJB),但是由于EJB配置复杂,且适用范围较小,于是很快就被淘汰了.与EJB的失败伴随而来的是另外一个框架的应运而生.他就是至今也比较流行的Hibe ...
- lintcode-98-链表排序
98-链表排序 在 O(n log n) 时间复杂度和常数级的空间复杂度下给链表排序. 样例 给出 1->3->2->null,给它排序变成 1->2->3->nu ...
- x86/x64的stack*****************************TBD
1.push parameter, %rdi,%rsi,%rdx,%rcx,%r8,%r9 用作函数参数,依次对应第1参数,第2参数... 2. push return address 3. push ...
- js canvas captcha
js canvas captcha https://thejackalofjavascript.com/building-a-captcha-using-html5-canvas/ https://a ...
- 【bzoj2049】[Sdoi2008]Cave 洞穴勘测 LCT
题目描述 辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好两个洞穴.假如 ...
- P1404 平均数
题目描述 给一个长度为n的数列,我们需要找出该数列的一个子串,使得子串平均数最大化,并且子串长度>=m. 输入输出格式 输入格式: N+1行, 第一行两个整数n和m 接下来n行,每行一个整数a[ ...
- taotao购物车2 解决购物车本地cookie和服务器redis不同步的问题
下面的思路逻辑一定要理清楚,比较绕 思路; 前面已经实现了在cookie本地维护购物车的功能, 这次加入和服务器同步功能, 因为 购物车 操作比较频繁,所以,后台服务器 用redis存储用户的购物车信 ...
- HNOI2002 营业额统计 [Splay]
题目描述 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是 ...
- POJ1984:Navigation Nightmare(带权并查集)
Navigation Nightmare Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 7871 Accepted: 2 ...