前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >图解jdk1.8新特性(2)---Lambda

图解jdk1.8新特性(2)---Lambda

作者头像
SecondWorld
发布2019-10-24 10:22:59
2650
发布2019-10-24 10:22:59
举报
文章被收录于专栏:Java开发者杂谈Java开发者杂谈

图解jdk1.8新特性(2)---Lambda

简要说明


jdk常用函数式接口

Predicate

代码语言:javascript
复制
@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

代码语言:javascript
复制
@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

代码语言:javascript
复制
@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

代码语言:javascript
复制
@FunctionalInterface
public interface Supplier<T> {
    T get();
}

  • supplier 完全是一个凭空创造者,不需要任何输入,直接返回预期输出

使Lambda更精简

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-10-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 图解jdk1.8新特性(2)---Lambda
    • 简要说明
      • jdk常用函数式接口
        • Predicate
        • Consumer
        • Function
        • Supplier
      • 使Lambda更精简
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档