三个函数接口概述

JDK预定义了很多函数接口以避免用户重复定义。最典型的是Function

@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
}

这个接口代表一个函数,接受一个T类型的参数,并返回一个R类型的返回值。

另一个预定义函数接口叫做Consumer,跟Function的唯一不同是它没有返回值。

@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}

还有一个Predicate,用来判断某项条件是否满足。经常用来进行筛滤操作:

@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
}

综上所述,一个λ表达式其实就是定义了一个匿名方法,只不过这个方法必须符合至少一个函数接口。

基本应用

POJO

public class Emp {
private int empno;
private String ename;
//getter|setter|toString略
public static void printEmp(Emp emp){
System.out.println("empno:"+emp.getEmpno()+"\nename:"+emp.getEname());
}
}

静态List

static List<Emp> emps = Arrays.asList(
new Emp(1, "yw"),
new Emp(2, "yt"),
new Emp(3, "yp"),
new Emp(4, "yc"));

Predicate应用

@Test
public void testPredicate()
{
Predicate<Emp> predicate = emp -> emp.getEmpno()>1;
for(Emp e:emps)
{
if(predicate.test(e))
{
Emp.printEmp(e);
}
}
}

运行

Function应用

@Test
public void testFunction() {
//抽取员工的名称
Function<Emp,String> function = emp -> emp.getEname(); for (Emp emp : emps)
{
String ename = function.apply(emp);
System.out.println(ename);
}
}

运行

Consumer应用

@Test
public void testConsumer()
{
Consumer<Emp> consumer = Emp::printEmp;
for(Emp e:emps)
{
consumer.accept(e);
}
}

运行

综合应用##

预处理函数

private <T,R> void printEmpNameWhenEmpNoLg1(Iterable<T> source,Predicate<T> predicate,Function<T,R> function,
Consumer<R> consumer)
{
for(T t:source)
{
if(predicate.test(t))
{
R r = function.apply(t);
consumer.accept(r);
}
}
}

此函数包含四个参数,分别为实现了Iterable接口的List(此例中即emps)及三个预定义函数接口。应用如下:

@Test
public void testFunctionInterface()
{
Predicate<Emp> predicate = emp -> emp.getEmpno()>1;
Function<Emp,String> function = emp -> emp.getEname();
Consumer<String> consumer = System.out::println;
printEmpNameWhenEmpNoLg1(emps,predicate,function,consumer);
}

运行

参考##

  1. Java8 Lambda表达式教程
  2. Lambda Expressions

Java8学习笔记(二)--三个预定义函数接口的更多相关文章

  1. C++ Primer学习笔记(三) C++中函数是一种类型!!!

    C++中函数是一种类型!C++中函数是一种类型!C++中函数是一种类型! 函数名就是变量!函数名就是变量!函数名就是变量! (---20160618最新消息,函数名不是变量名...囧) (---201 ...

  2. Java8学习笔记(三)--方法引入

    基本概念 格式 实例变量名 | 类名 :: 静态方法 | 实例方法 作用 简化Lambda表达式 示例 a -> System.out.println(a); <=> System. ...

  3. C#笔记(二)变量之预定义的引用类型

    1.object类型 在C#中, object类型就是最终的父类型,所有内置类型和用户定义的类型都从它派生而 来. 这样, object类型就可以用于两个目的了: 可以使用object引用绑定任何子类 ...

  4. Java学习笔记二十八:Java中的接口

    Java中的接口 一:Java的接口: 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承 ...

  5. Scala学习笔记(三)—— 方法和函数

    1. 方法 方法使用 def 定义: def 方法名(参数名:参数列表,…) :返回值类型 = { 方法结构体 } scala> def add(x : Int ,y : Int):Int = ...

  6. Java8学习笔记目录

    Java8学习笔记(一)--Lambda表达式 Java8学习笔记(二)--三个预定义函数接口 Java8学习笔记(三)--方法引入 Java8学习笔记(四)--接口增强 Java8学习笔记(五)-- ...

  7. Java8学习笔记(八)--方法引入的补充

    在Java8学习笔记(三)--方法引入中,简要总结了方法引入时的使用规则,但不够完善.这里补充下几种情况: 从形参到实例方法的实参 示例 public class Example { static L ...

  8. Atitit.跨平台预定义函数 魔术方法 魔术函数 钩子函数 api兼容性草案 v2 q216  java c# php js.docx

    Atitit.跨平台预定义函数 魔术方法 魔术函数 钩子函数 api兼容性草案 v2 q216  java c# php js.docx 1.1. 预定义函数 魔术方法 魔术函数是什么1 1.2. & ...

  9. ES6学习笔记<二>arrow functions 箭头函数、template string、destructuring

    接着上一篇的说. arrow functions 箭头函数 => 更便捷的函数声明 document.getElementById("click_1").onclick = ...

随机推荐

  1. Shiro笔记(五)JSP标签

    Shiro笔记(五)JSP标签 导入标签库 <%@taglib prefix="shiro" uri="http://shiro.apache.org/tags&q ...

  2. swoole深入学习 4. process

    swoole-1.7.2增加了一个进程管理模块,用来替代PHP的pcntl扩展.pcntl是php新增的一个多进程扩展,用来实现多进程,但是有很多不完善的地方,swoole 就完善了这些地方,而且使得 ...

  3. Git Windows 安装

    环境 Windows版本:Windows 7 旗舰版 处理器:Inte i5 系统类型:64 位操作系统 下载 Git Windows https://github.com/git-for-windo ...

  4. Windows下的搜索神器 —— everything

    介绍一款Windows下的神奇 -- everything,软件很小巧,但是搜索速度非常快,比Windows自带的搜索功能更强大.更快.掌握它的基本用法,在查找文件时能提升很高的效率 1.下载 2.基 ...

  5. SpringMVC核心分发器DispatcherServlet分析

    本文将分析SpringMVC的核心分发器DispatcherServlet的初始化过程以及处理请求的过程,让读者了解这个入口Servlet的作用. DispatcherServlet初始化过程 在分析 ...

  6. raw_socket(原始套接字)以及普通socket使用终极总结

      一.传输层socket(四层socket,普通socket) 可参考本人以下博客: Windows Socket编程之UDP实现大文件的传输:http://blog.csdn.net/luchen ...

  7. LiteIDE 在 Windows 下为 Go 语言添加智能提示代码补全

    本文以 Windows 7 64 位为环境,go1.4.2.windows-amd64 和 liteidex27.2.1.windows-qt5 为例. 成功搭建开发环境后,发现 LiteIDE 没有 ...

  8. maven 解决jar冲突

    那句话怎么讲来着的... 引用 如果你爱他,就请让他用Maven,因为那里是天堂,如果你恨他,就请让他用Maven,因为那里是地狱. Maven对于新手来说是<步步惊心>,因为它包罗万象, ...

  9. Spark实现K-Means算法

    K-Means算法是一种基于距离的聚类算法,采用迭代的方法,计算出K个聚类中心,把若干个点聚成K类. MLlib实现K-Means算法的原理是,运行多个K-Means算法,每个称为run,返回最好的那 ...

  10. MongoDB 进程控制系列二:结束进程

    1:如果某个进程产生了异常,可以考虑将其kill掉 db.killOp(10417) db.killOp(10417/*opid*/) 等同于: db.$cmd.sys.killop.findOne( ...