• 函数接口介绍

  • 在Java1.8中,新增了Lambda表达式。在.net3.5(C# 3.0)在原先的匿名方法基础上演变出了Lambda表达式。学过C# Lambda表达式的同学,对于Java的Lambda表达式就不会太陌生。
  • 在Java中,没有委托的概念,为了配合Lambda表达式,Java推出了函数接口这个概念,来作为Java Lambda表达式的类型。
  • 1. 函数接口定义:

  • 函数接口是只有一个抽象方法的接口,用作于Lambda表达式的类型
  • 注解:
  • 1.在所定义的接口类上加上@FunctionalInterface注解,主要用于编译错误检查
  • 2.我们所定义的接口,有且只有一种抽象方法(没有方法体的方法)
  • 3.允许定义默认方法(使用default修饰的方法)
  • 4.允许定义静态方法
//定义一个函数接口
@FunctionalInterface
public interface Speak {
    void say(String msg);
}

//未新增Lambda表达式的时候,实现Speak接口如下
Speak hello = new Speak() {
    @Override
    public void say(String msg) {
        System.out.println(msg);
    }
};

hello.say("hello world.");//输出hello world.

//新增Lambda表达式之后,实现Speak接口如下,有没有觉得代码精简许多
Speak hello = msg -> System.out.println(msg);

hello.say("hello world.");//输出hello world.
  • 2. Lambda表达式的简化过程

  • lambda表达式有类型推断的功能(Java1.7引入的),可以在javac推断出泛型参数的类型。
//lambda表达式版本1
BinaryOperator<Integer> addComplex = (Integer x, Integer y) -> {
            return x - y;
        };

//利用类型推断之后的产生版本2,这时候可以省略参数的类型
BinaryOperator<Integer> addComplex = (x, y) -> {
            return x - y;
};

//如果Lambda表达式Body只有一行代码,可以省略掉大括号({})
BinaryOperator<Integer> addComplex = (x, y) -> x - y;
  • 3. 系统提供的函数接口

  • 在C# 3.0中,有默认提供的Func<...>泛型委托及Action<...>泛型委托。在Java1.8中,同样有类似默认提供的函数接口。其中重要的函数接口如下:
  • 3.1 BinaryOperator
  • 参数: (T,T)
  • 返回类型: T
  • 说明: 二元操作符函数接口
  • 示例:
BinaryOperator<Integer> add = (x, y) -> x + y ;
System.out.println(add.apply(1, 2));//3
  • 3.2 UnaryOperator
  • 参数: T
  • 返回类型: T
  • 说明: 一元操作符函数接口
  • 示例:
UnaryOperator<Boolean> result = x -> !x;
System.out.println(result.apply(1 > 0));//false
  • 3.3 Predicate
  • 参数: T
  • 返回类型: boolean
  • 说明: 条件判断函数接口
  • 示例:
Predicate<Integer> predicate = x -> x > 0;
System.out.println(predicate.test(1));//true
  • 3.4 Consumer
  • 参数: T
  • 返回类型: void
  • 说明: T作为输入,执行某种动作但没有返回值(类似我们上面Speak接口定义的)
  • 示例:
Consumer<String> say = msg -> System.out.println(msg);
say.accept("Hello World Java 1.8");//Hello World Java 1.8
  • 3.5 Function
  • 参数: T
  • 返回类型: R
  • 说明: 接受一个T参数,并返回R类型的函数接口
  • 示例:
Function<String, Integer> strLen = m -> m.length();//计算输入的字符串的长度
System.out.println(strLen.apply("HelloWorld"));//10
  • 3.6 Supplier
  • 参数: None
  • 返回类型: T
  • 说明: 没有任何输入,返回T
  • 示例:
Supplier<String> he=()->"HelloWorld.";
System.out.print(he.get());
  • 4. 总结

  • 1.Lambda表达式是一个匿名方法,将行为像数据一样进行传递
  • 2.函数接口指仅具有单个抽象方法的接口,用来表示Lambda表达式的类型

  • 5. 习题

  • 1.哪些是Lambda表达式Function的有效实现,并说明不对的理由。

x -> x + 1;
(x, y) -> x + 1;
x -> x ==1;
  • 2.FirstLambda的两个check是能够正确重载,其中firstLambda.check又是调用的哪个check方法
@FunctionalInterface
public interface Check {
    boolean IntPred(Integer n);
}

public class FirstLambda {
    public static void main(String[] args) {
        Predicate<Integer> predicate = x -> x > 0;
        FirstLambda firstLambda = new FirstLambda();
        boolean result=firstLambda.check(predicate, 2);
        System.out.println(result);
    }

    public boolean check(Predicate<Integer> predicate, int n) {
        return predicate.test(n);
    }

    public boolean check(Check check, int n) {
        return check.IntPred(n);
    }
}

Java 8函数编程轻松入门的更多相关文章

  1. Java 8函数编程轻松入门(三)默认方法详解(default function)

    default出现的原因 Java 8中对API最大的改变在于集合类,Java在持续演进,但是它一直保持着向后兼容. 在Java 8中为Collection接口增加了stream方法,这意味着所有实现 ...

  2. Java 8函数编程轻松入门(五)并行化(parallel)

    1.并发与并行的区别 并发: 一个时间段内有几个程序都处于已启动到运行完毕之间,且这几个程序都是在同一个处理机上运行.但在任一个时刻点只有一个程序在处理机上运行 并行: 在同一个时刻,多核处理多个任务 ...

  3. Java 8函数编程轻松入门(四)方法引用

    C#中系统提供了许多IEnumerable的扩展方法.同样在Java 8中新引入了Collector类. 1.方法引用 定义: 简而言之:就是一个Lambda表达式.在Java 8中,我们我们会使用L ...

  4. Java 8函数编程轻松入门(二)Stream的使用

    在C#中,微软基于IEnumerable接口,提供许多便捷的扩展方法,便于实际的开发.在Java 1.8中,Collection接口新增了default stream方法.我们可以针对java集合,在 ...

  5. Groovy轻松入门——通过与Java的比较,迅速掌握Groovy (更新于2008.10.18)

    摘自: http://www.blogjava.net/BlueSUN/archive/2007/03/10/103014.html Groovy轻松入门--通过与Java的比较,迅速掌握Groovy ...

  6. Groovy轻松入门——通过与Java的比较,迅速掌握Groovy

    转自 :Groovy轻松入门——通过与Java的比较,迅速掌握Groovy (更新于2008.10.18) 在前几篇文章中,我已经向大家介绍了Groovy是什么,学习Groovy的重要性等内容,还不了 ...

  7. Groovy轻松入门——搭建Groovy开发环境

    摘自: http://www.blogjava.net/BlueSUN/archive/2007/03/17/104391.html Groovy轻松入门--搭建Groovy开发环境 多日来,我发表了 ...

  8. C++ STL编程轻松入门基础

    C++ STL编程轻松入门基础 1 初识STL:解答一些疑问 1.1 一个最关心的问题:什么是STL 1.2 追根溯源:STL的历史 1.3 千丝万缕的联系 1.4 STL的不同实现版本 2 牛刀小试 ...

  9. Swift轻松入门——基本语法介绍和详细地Demo讲解(利用WebView打开百度、新浪等网页)

    转载请务必注明出处(all copyright reserved by iOSGeek) 本文主要分为两个部分,第一部分介绍Swift的基本语法,第二部分讲解一个利用WebView来打开百度.sina ...

随机推荐

  1. MIT 6.828 JOS学习笔记12 Exercise 1.9

    Lab 1中Exercise 9的解答报告 Exercise 1.9: 判断一下操作系统内核是从哪条指令开始初始化它的堆栈空间的,以及这个堆栈坐落在内存的哪个地方?内核是如何给它的堆栈保留一块内存空间 ...

  2. PDA手持机 移动开单进销存系统 现场出打印凭据和扫码 新的亮点

    传统车销模式弊端:1.手写开单,效率低,动作慢2.现场手写开单明细不能打印,产品明细不规范3.电脑办公人员及车销人员对车上的库存情况掌握不清楚,销售人员对每种产品销售价格不清楚4.老板对员工工作的管控 ...

  3. 机器学习之K-近邻算法

    机器学习可分为监督学习和无监督学习.有监督学习就是有具体的分类信息,比如用来判定输入的是输入[a,b,c]中的一类:无监督学习就是不清楚最后的分类情况,也不会给目标值. K-近邻算法属于一种监督学习分 ...

  4. 分布式服务协调技术zookeeper笔记

    本文主要学习ZooKeeper的体系结构.节点类型.节点监听.常用命令等基础知识,最后还学习了ZooKeeper的高可用集群的搭建与测试.希望能给想快速掌握ZooKeeper的同学有所帮助. ZooK ...

  5. div高度根据内容自动增大

    1.很多时候我们希望容器高度能够自适应内部元素的变化,需要用到min-height属性. 2.有时候用了min-height还是不会随着内容自适应高度,您需要检查下容器的子元素是不是有浮动属性,当子元 ...

  6. linux shell输出带颜色文本

    echo -e "\033[33;31m Color Text" - red echo -e "\033[33;32m Color Text" - green ...

  7. SQLServer CASE WHEN 用法

    SELECT sc.NAME AS 学校名称 ,xueyuan.NAME AS 院系 ,StudentNo AS 学号 ,st.StudentName AS 学生姓名 ,st.sex AS 性别 ,s ...

  8. js判断图片是否加载完成

    var img = new Image(); //新建一个图片对象:img.src = ...; //图片地址是你准备要加载的地址:if(img.complete){ //表示图片已经加载完成}

  9. Shader实例:NGUI制作网格样式血条

    效果: 思路: 1.算出正确的uv去采样过滤图,上一篇文章说的很明白了.Shader实例:NGUI图集中的UISprite正确使用Shader的方法 2.用当前血量占总血量的百分比来设置shader中 ...

  10. less杂记

    less最管用的就是嵌套,让css关系很清晰,虽然增加代码量,我认为也是值得的,不用less的话会有些怀念嵌套的各种优势,但是层次太多,嵌套太长会让可读性变得很差,这点也是个问题. 1.less中的& ...