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表达式作为实参传入方法,实现接口中的方法的具体实现。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容