三个函数接口概述

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. 【翻译】TCP backlog在Linux中的工作原理

    原文How TCP backlog works in Linux水平有限,难免有错,欢迎指出!以下为翻译: 当应用程序通过系统调用listen将一个套接字(socket)置为LISTEN状态时,需要为 ...

  2. 在 Gradle 中使用 MyBatis Generator

    在 Intellij IDEA 中结合 Gradle 使用 MyBatis Generator 逆向生成代码 Info: JDK 1.8 Gradle 2.14 Intellij IDEA 2016. ...

  3. C++中int与string的相互转换【转】

    一.int转string 1.c++11标准增加了全局函数std::to_string: string to_string (int val); string to_string (long val) ...

  4. NModbus类库使用

    通过串口进行通信 : 1.将 NMobus 类库导入工程中,添加引用.命名空间.工程属性必须配置 为 .NET 4.0. 2.创建 SerialPort 类的一个实例,配置参数,打开串口,如: pub ...

  5. Json解析包FastJson使用

    阿里巴巴FastJson是一个Json处理工具包,包括“序列化”和“反序列化”两部分,它具备如下特征:速度最快,测试表明,fastjson具有极快的性能,超越任其他的Java Json parser. ...

  6. Mysql 8 常用命令测试

    1.创建数据库,帐号及授权 create database testdb; CREATE USER 'rusking'@'%' IDENTIFIED BY '12345678'; CREATE USE ...

  7. 解决《UNIX环境高级编程》(APUE)示例代码的编译问题

    转自 http://cunsheng.sinaapp.com/?p=360 APUE中示例很多, 把这些源码拿来跑跑调调对学习理解有着莫大的帮助, 随书网站就提供了源码下载, 不过我自己在Linux和 ...

  8. Go 程序的性能调试问题

    英文原文:Debugging performance issues in Go programs 假设你手上有个Go语言编写的程序,你打算提升它的性能.目前有一些工具可以为此提供帮助.这些工具能帮你发 ...

  9. 微信公众号 几种移动端UI框架介绍

    微信公众号开发,主要是移动端网页的页面开发,在这里推荐3个移动端UI框架:WeUI.SUI和Mint UI. 1. WeUI 1.1 WeUI WeUI是微信官方设计团队为微信 Web 开发量身设计, ...

  10. Android 网络知识必知必会

    目录: 网络分层 TCP 和 UDP 区别 TCP 三次握手以及为什么需要三次握手 UDP 四次挥手以及为什么需要四次挥手 socket 开发相关 Http 是什么 Https 是什么以及和 HTTP ...