Java 8 Lambda表达式常见写法

接上一篇,lambda表达式的基本逻辑,这次总结了接种特殊的使用方法。

一、对象::实列方法名

特点:
1、表达式体调用的方法,在接口中已经实现,不需要再在调用的时候实现。使用此方法;
2、调用的方法,参数列表和返回值,既已经实现的方法签名,和Lambda表达式一致;

@Test
    public void test1(){
        Consumer<String> consumer1 = (x)-> System.out.println(x);
        //上面表达式的简写如下
        Consumer<String> consumer2 = System.out::println;
        consumer1.accept("This is output sequence");//控制它输出:This is output sequence
    }

Consumer是Java自带的接口,是“消费性”接口,以上代码的大白话可以翻译成:接口的accept方法接受一个参数,它的据体实现是打印接收到的那句话。此时可以将参数省略。该接口部分代码如下:

@FunctionalInterface
public interface Consumer<T> {

    /**
     * Performs this operation on the given argument.
     *
     * @param t the input argument
     */
    void accept(T t);
}

二、类::静态方法名

@Test
public void test3(){
    Comparator<Integer> com = (x,y)->Integer.compare(x,y);
    System.out.println(com.compare(20,22));//输出:-1
    
    Comparator<Integer> compare = Integer::compare;
    System.out.println(compare.compare(20,22));//输出:-1
}

Comparator接口的“比较”部分代码如下:

@FunctionalInterface
    public interface Comparator<T> {
        /**
         * Compares its two arguments for order.  Returns a negative integer,
         * zero, or a positive integer as the first argument is less than, equal
         * to, or greater than the second.

         * @param o1 the first object to be compared.
         * @param o2 the second object to be compared.
         * @return a negative integer, zero, or a positive integer as the
         *         first argument is less than, equal to, or greater than the
         *         second.
         * @throws NullPointerException if an argument is null and this
         *         comparator does not permit null arguments
         * @throws ClassCastException if the arguments' types prevent them from
         *         being compared by this comparator.
         */
        int compare(T o1, T o2);
    }

Integer的compare方法定义如下:

public final class Integer extends Number implements Comparable<Integer> {
    public static int compare(int x, int y) {
        return (x < y) ? -1 : ((x == y) ? 0 : 1);
    }
}

三、类::实列方法

@Test
public void test4(){
    BiPredicate<String,String> bp = (x ,y )->x.equals(y);
    //此方法使用限制:
    //x是方法的调用者,y是方法参数
    BiPredicate<String, String> bp2= String::equals;
    System.out.println(bp2.test("a","ab")); //output: false
}

BiPredicate接口部分代码如下:

@FunctionalInterface
public interface BiPredicate<T, U> {
/**
* Evaluates this predicate on the given arguments.
*
* @param t the first input argument
* @param u the second input argument
* @return {@code true} if the input arguments match the predicate,
* otherwise {@code false}
*/
boolean test(T t, U u);
}

String.equals()的签名如下:

public boolean equals(Object anObject) {}

四、构造器引用

格式: classname::new
被调用的构造器的参数列表,与接口中抽象方法的参数列表一致。

@Test
public void test5(){
    //调用哪种构造参数,取决于接口,
    //==>> 如Supplier的方法,是无参函数
    //==>> Function的方法,接受一个参数,返回一个类型
    //调用无参构造
    Supplier<Employee> emp = ()->new Employee(); //实例化返回一个employee对象
    Supplier<Employee> emp1= Employee::new;
    //调用,根据无参构造,返回一个对象
    Employee employee = emp.get();

    //调用一个参数的构造函数
    Function<Integer, Employee> fun1 = (number)->new Employee(number);
    Function<Integer, Employee> fun2 = Employee::new ;
    //调用,根据用户编号返回用户
    Employee employeer = fun1.apply(201);
}

Java自带Supplier接口,代码如下:

@FunctionalInterface
public interface Supplier<T> {

    /**
     * Gets a result.
     *
     * @return a result
     */
    T get();
}

Function接口的部分代码如下:

@FunctionalInterface
public interface Function<T, R> {

    /**
     * Applies this function to the given argument.
     *
     * @param t the function argument
     * @return the function result
     */
    R apply(T t);
}

五、数组引用

 @Test
 public void test6(){
     Function<Integer, String[]> fun = (x)->new String[x];
     String[] strings = fun.apply(10);
     System.out.println(strings.length);//输出10

    Function<Integer, String[]> fun2= String[]::new;
    String[] strings1 = fun2.apply(20);
    System.out.println(strings1.length);//输出20
}

数组也是一个对象。

以上五种写法,归根结底,还是不变的先定义接口,然后定义一个方法,将接口作为形参,最后使用lambda表达式作为实参传入方法,实现接口中的方法的具体实现。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容