zoukankan      html  css  js  c++  java
  • 图说jdk1.8新特性(2)--- Lambda

    简要说明


    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表达式可以用前面所说的方法引用形式进一步简化

  • 相关阅读:
    路西法效应 和 数学公式输入
    coursera python
    epub java
    How do remove the CD / DVD install as a source for apt-get packages when installing new features?
    vmware player 去除full screen的bar
    Install VMware tools on Ubuntu 20.04 Focal Fossa Linux
    java poi for word
    handwriting ocr
    总结5.22PHP网络与变量
    总结5.12js代表练习题
  • 原文地址:https://www.cnblogs.com/Kidezyq/p/11728110.html
Copyright © 2011-2022 走看看