简要说明


jdk常用函数式接口

Predicate

@FunctionalInterface
public interface Predicate<T> {
boolean test(T t); default Predicate<T> and(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) && other.test(t);
} default Predicate<T> negate() {
return (t) -> !test(t);
} default Predicate<T> or(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) || other.test(t);
} static <T> Predicate<T> isEqual(Object targetRef) {
return (null == targetRef)
? Objects::isNull
: object -> targetRef.equals(object);
}
}
  • predicate接口返回一个测试结果,结果类型为true或者false
  • predicate支持and、or、negate方法

Consumer

@FunctionalInterface
public interface Consumer<T> {
void accept(T t); default Consumer<T> andThen(Consumer<? super T> after) {
Objects.requireNonNull(after);
return (T t) -> { accept(t); after.accept(t); };
}
}
  • consumer接口接受一个参数,然后对该参数做消费,返回void

  • consumer支持通过andThen方法来进行链式调用消费


Function

@FunctionalInterface
public interface Function<T, R> {
R apply(T t); default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
Objects.requireNonNull(before);
return (V v) -> apply(before.apply(v));
} default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
Objects.requireNonNull(after);
return (T t) -> after.apply(apply(t));
} static <T> Function<T, T> identity() {
return t -> t;
}
}
  • Function接口可以看做是一个工厂,接收原料得到产出

  • Function接口可以通过compose方法进行前置调用,通过andThen方法进行后置调用,通过identity方法得到传入参数

  • 注意compose方法和andThen方法的参数定义中使用的<? super X> 和 <? extends X> , 使用的方式完全满足 PECS原则(produce extends consume super)


Supplier

@FunctionalInterface
public interface Supplier<T> {
T get();
}
  • supplier 完全是一个凭空创造者,不需要任何输入,直接返回预期输出

使Lambda更精简

  • lambda表达式大部分情况下可以唯一确定参数的类型,所以可以省略参数类型只写参数名称
  • 当lambda表达式的表达式部分只包含一条语句的时候,可以省略大括号,return 语句以及句尾的分号
  • lambda表达式可以用前面所说的方法引用形式进一步简化

图说jdk1.8新特性(2)--- Lambda的更多相关文章

  1. jdk1.8新特性之lambda表达式

    lambda表达式其实就是指一个匿名函数,应用最广泛的就是匿名内部类的简化.在jdk1.8之前,我们定义一个匿名内部类可能需要写一大坨代码,现在有了lambda之后,可以写的很简洁了.但不是说lamb ...

  2. JDK1.8新特性(一) ----Lambda表达式、Stream API、函数式接口、方法引用

    jdk1.8新特性知识点: Lambda表达式 Stream API 函数式接口 方法引用和构造器调用 接口中的默认方法和静态方法 新时间日期API default   Lambda表达式     L ...

  3. jdk1.8新特性之lambda表达式及在Android Studio中的使用举例

    Jdk1.8已经出很久了但是很多同学对它的特性在android studio 中的应用可能还不是很熟悉,今天我们就来对这个新特性在AS中做它的应用实践. 一.首先在有JDK1.8的情况下我们要在AS的 ...

  4. 图说jdk1.8新特性(3)--- 注解与类型推测优化

    获取同一类型多个注解 ​ jdk1.8的java.lang.Class类新增了方法getAnnotationsByType方法,该方法可以获取某一个类型的注解列表,具体代码示例如下: public c ...

  5. 图说jdk1.8新特性(1)--- 函数式接口

    函数式接口 总结起来就以下几点: 如果一个接口要想成为函数接口(函数接口可以直接用lambda方式简化),则必须有且仅有一个抽象的方法(非default和static) 可以通过注解@Function ...

  6. 图说jdk1.8新特性(5)--- 编译器新特性

    /** * Returns the name of the parameter. If the parameter's name is * {@linkplain #isNamePresent() p ...

  7. 图说jdk1.8新特性(4)--- stream

    总述 jdk1.8引入了Stream相关的API,通过该API.可以实现流式编程,使你写代码的时候行云流水 Stream使得集合的转换变得更加简单,原来可能需要写多个for循环或者多个if判断的,直接 ...

  8. jdk1.8新特性之方法引用

    方法引用其实就是方法调用,符号是两个冒号::来表示,左边是对象或类,右边是方法.它其实就是lambda表达式的进一步简化.如果不使用lambda表达式,那么也就没必要用方法引用了.啥是lambda,参 ...

  9. JDK1.8新特性之(一)--Lambda表达式

    近期由于新冠疫情的原因,不能出去游玩,只能在家呆着.于是闲来无事,开始阅读JDK1.8的源代码.在开始之前也查询了以下JDK1.8的新特性,有针对性的开始了这段旅程. 只看不操作,也是不能心领神会的. ...

随机推荐

  1. Transaction 那点事儿

    Transaction 那点事儿 https://my.oschina.net/huangyong/blog/160012

  2. Java学习-055-Jsoup爬虫通过设置获取响应数据大小的最大值,解决因默认获取 1MB 响应数据导致的无法获取全部的响应数据内容问题

    在日常工作中,通常会遇到获取各种网络数据使用的情况,Java中可使用Jsoup(Python中可使用 BeatifulSoup)进行数据的获取及处理. 今天有朋友问,在使用 Jsoup 进行请求数据时 ...

  3. LeetCode 559. Maximum Depth of N-ary Tree(N-Tree的深度)

    Given a n-ary tree, find its maximum depth. The maximum depth is the number of nodes along the longe ...

  4. 请关注订阅号,获取demo,学术讨论

  5. 在nginx环境下搭建基于ssl证书的websocket服务转发,wss

    1.证书准备 本地调试,可以安装自签名证书,安装方法参考https本地自签名证书添加到信任证书访问 2.修改配置文件 将上面的配置文件拷贝到conf目录,添加或者修改节点如下 # HTTPS serv ...

  6. react一些问题

    一.死循环 1.问题描述 function handleClick() { this.setState({count: ++this.state.count}); console.log(" ...

  7. web基础---->script标签的特殊使用

    今天要讲的就是怎样使用<script>去请求一个servlet,加载一些js资源以及额外的逻辑处理: 目录: JS的引入的几种方式 在script的标签中引入Servlet 动态引入JS的 ...

  8. 进程退出:SIGINT、SIGTERM和SIGKILL区别

    一.SIGINT.SIGTERM和SIGKILL区别 SIGINT与SIGTERM区别1)SIGINT关联ctrl+c2)SIGINT只能结束前台进程3)通过ctrl+c对当前进程发送结束信号,信号被 ...

  9. Java对象在内存的结构

    一.内存布局 对象在内存中存储的结构由三部分组成:对象头.实例数据.对齐填充. 对象头 MarkWord(标记字段):哈希码.分代年龄.锁标志位.偏向线程ID.偏向时间戳等信息.Mark Word被设 ...

  10. turtle1

    #画风车 from turtle import * pensize(2) for i in range(4): seth(360-i*90) fd(150) rt(90) circle(-150,45 ...