[译]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 ...
随机推荐
- c# log
public static void WriteMsg(string logName, string msg) { try { //string path = Path.Combine(". ...
- vector sort AND 友元
# include<iostream> # include<string> # include<algorithm> # include<stdio.h> ...
- A1
It’s surprising what you can find at the end of your garden. Wild flowers... and even smaller yet, i ...
- 【WebService】——入门实例
服务端 服务: 1.add(int a,int b) 2.minus(int a,int b) 具体如下: <pre name="code" class="java ...
- js计算当前日期上一个月和下一个月
/** * 获取上一个月 * * @date 格式为yyyy-mm-dd的日期,如:2014-01-25 */ funct ...
- 高中信息技术《算法与程序设计VB(选修)》知识要点
原博主: http://blog.sina.com.cn/buyanshibai [转载] (一)算法 1.定义 相关题解: 1算法:就是解决问题的方法和步骤.算法是程序设计的“灵魂”,算法+数据结构 ...
- [学习笔记]可持久化数据结构——数组、并查集、平衡树、Trie树
可持久化:支持查询历史版本和在历史版本上修改 可持久化数组 主席树做即可. [模板]可持久化数组(可持久化线段树/平衡树) 可持久化并查集 可持久化并查集 主席树做即可. 要按秩合并.(路径压缩每次建 ...
- Ubuntu下安装LNMP之php7的安装并配置Nginx支持php及卸载php
据了解,php7是比之前的版本性能快很多的.http://php.net/get/php-7.2.2.tar.gz/from/a/mirror 安装前也可提前将相关依赖库安装好,或者在安装php时若安 ...
- BZOJ1001:狼抓兔子(最小割最大流+vector模板)
1001: [BeiJing2006]狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨, ...
- React 入门小结
前段时间用 Ant Design 做了一个项目,由于之前没有 React 基础,对于 ES6 也是一知半解,所以也是一边开发一边学习,好不容易把项目完成了,现在终于有时间沉下心来从头开始好好学一下 R ...