昆仑山:眼中无形心中有穴之穴人合一

夫君子之行,静以修身,俭以养德;非澹泊无以明志,非宁静无以致远。夫学须静也,才须学也;非学无以广才,非志无以成学。怠慢则不能励精,险躁则不能冶性。年与时驰,意与岁去,遂成枯落,多不接世。悲守穷庐,将复何及!

 

Java:Lamda 表达式

例子01

package com.cnblogs.wanson;

public class RunnableImpl implements Runnable {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"\t:\t"+Thread.currentThread().getId() +
                "\t新的线程创建了");
        System.out.println("What I saw make me very sad");
    }
}

多线程演化过程

package com.cnblogs.wanson;

/**
 * 使用实现Runnable接口的方式实现多线程程序
 */
public class Driver {
    public static void main(String[] args) {
        //第一版 /原生版
//        创建Runnable接口的实现类对象
        RunnableImpl runnable = new RunnableImpl();
//        创建Thread类对象,构造方法中传递Runnable接口的实现类
        Thread thread = new Thread(runnable);
//        调用start方法开启新线程,执行run方法
        thread.start();

        // 进化第2版

//        简化代码,使用匿名内部类,实现多线程程序
        Runnable runnable1 = new Runnable() {

            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "\t:\t"+Thread.currentThread().getId() +
                        "\t新的线程创建了");
                System.out.println("there is no choice but to learn");
            }
        };

        new Thread(runnable1).start();


        // 进化第3版
        new Thread(
                new Runnable() {

                    @Override
                    public void run() {
                        System.out.println(Thread.currentThread().getName() + "\t:\t"+Thread.currentThread().getId() +
                                "\t新的线程创建了");
                        System.out.println("good good study,day day up");
                    }
                }
        ).start();

        // 进化第4版   使用lamda表达式,实现多线程

        new Thread(() -> {
            System.out.println(Thread.currentThread().getName() + "\t:\t"+Thread.currentThread().getId() +
                    "\t新的线程创建了");
            System.out.println("nothing is equal to knowledge");
        }
        ).start();
//        优化省略lamda
        new Thread(() -> System.out.println(Thread.currentThread().getName() + "\t:\t"+Thread.currentThread().getId() +
                    "\t新的线程创建了")).start();

    }


}

例子02 排序

package com.cnblogs.wanson;

import java.util.Arrays;
import java.util.Comparator;

public class Driver {
    public static void main(String[] args) {
        String[] names = {"jim", "anna", "john", "wanson", "andrew"};
        for (String s : names) {
            System.out.print(s + "\t");
        }
//       进化第1版
        Arrays.sort(names, new Comparator<String>() {
            @Override
            public int compare(String a, String b) {
                return b.compareTo(a);
            }
        });
        System.out.println();
        for (String s : names) {
            System.out.print(s + "\t");
        }
//********************************************************
        //       进化第2版
        Arrays.sort(names, (String a, String b) -> {
            return b.compareTo(a);
        });
        System.out.println();
        for (String s : names) {
            System.out.print(s + "\t");
        }


//********************************************************
        //       进化第3版
        Arrays.sort(names, (String a, String b) -> b.compareTo(a));
        System.out.println();
        for (String s : names) {
            System.out.print(s + "\t");
        }


    }

}

lambda 玩法的套路

/**

  • Lambda表达式的标准格式:
  • 由三部分组成:
  • a.一些参数
  • b.一个箭头
  • c.一段代码
  • 格式:
  • (参数列表)->{一些重写方法的代码};
  • 解释说明格式:
  • ():接口中抽象方法的参数列表,没有参数,就空着;有参数就写出参数,多个参数使用超号分隔
  • ->:传递的意思,把参数传递给方法体{}
  • {}:重写接口的抽象方法的方法体
    */

例子03 做饭-吃饭 没有参数 没有返回值

package com.cnblogs.wanson;

public interface Cook {
   public abstract void makeFood();
}


package com.cnblogs.wanson;

import java.util.Arrays;
import java.util.Comparator;

/**
 * Lambda表达式的标准格式:
 * 由三部分组成:
 * a.一些参数
 * b.一个箭头
 * c.一段代码
 *
 *
 * 格式:
 * (参数列表)->{一些重写方法的代码};
 *
 * 解释说明格式:
 * ():接口中抽象方法的参数列表,没有参数,就空着;有参数就写出参数,多个参数使用超号分隔
 *
 * ->:传递的意思,把参数传递给方法体{}
 *
 * {}:重写接口的抽象方法的方法体
 */

public class Driver {
    public static void main(String[] args) {
        // 演化第1代
        invokeCook(new Cook() {
            @Override
            public void makeFood() {
                System.out.println("吃饭了,小猪们");
            }
        });

        // 演化第2代
        invokeCook(()->{
            System.out.println("吃饭了,小狗崽们");
        });
    }

//    定义一个方法,参数传递Cook接口,方法内部调用Cook接口中的方法makeFood
    public static void invokeCook(Cook cook){
        cook.makeFood();
    }




}





例子04 有参返回值 身份证信息 按照年龄排序

package com.cnblogs.wanson;

public class Person {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}



package com.cnblogs.wanson;

import java.util.Arrays;
import java.util.Comparator;

/**
 * Lambda表达式的标准格式:
 * 由三部分组成:
 * a.一些参数
 * b.一个箭头
 * c.一段代码
 *
 *
 * 格式:
 * (参数列表)->{一些重写方法的代码};
 *
 * 解释说明格式:
 * ():接口中抽象方法的参数列表,没有参数,就空着;有参数就写出参数,多个参数使用超号分隔
 *
 * ->:传递的意思,把参数传递给方法体{}
 *
 * {}:重写接口的抽象方法的方法体
 */

public class Driver {
    public static void main(String[] args) {
        Person[] person={
          new Person("wanson",16),
          new Person("jim",12),
          new Person("lily",18),
          new Person("andrew",10)
        };

        for (Person people : person) {
            System.out.println(people);
        }
        //年龄升序
        Arrays.sort(person, new Comparator<Person>() {
            @Override
            public int compare(Person x, Person y) {
                return x.getAge()-y.getAge();
            }
        });
        System.out.println();
        for (Person people : person) {
            System.out.println(people);
        }

        // 利用lambda 手段

        Arrays.sort(person, (Person x, Person y)-> {
                return x.getAge()-y.getAge();
        });

        System.out.println();
        for (Person people : person) {
            System.out.println(people);
        }



    }
}







例子05 两个数相加

package com.cnblogs.wanson;

public interface Calculator {
    public  abstract int compute(int x,int y);
}


package com.cnblogs.wanson;

import java.util.Arrays;
import java.util.Comparator;

/**
 * Lambda表达式的标准格式:
 * 由三部分组成:
 * a.一些参数
 * b.一个箭头
 * c.一段代码
 *
 *
 * 格式:
 * (参数列表)->{一些重写方法的代码};
 *
 * 解释说明格式:
 * ():接口中抽象方法的参数列表,没有参数,就空着;有参数就写出参数,多个参数使用超号分隔
 *
 * ->:传递的意思,把参数传递给方法体{}
 *
 * {}:重写接口的抽象方法的方法体
 */

public class Driver {
    public static void main(String[] args) {
        invokeCompute(44, 55, new Calculator() {
            @Override
            public int compute(int x, int y) {
                return x+y;
            }
        });

        invokeCompute(30,45,(int x, int y)->{
            return x+y;
        });

    }

    private static void invokeCompute(int a,int b,Calculator calculator){
        System.out.println("两个数和结果为:\t"+calculator.compute(a,b));
    }
}





lambda 省略前提条件

/**
 * Lambda表达式:是可推导,可以省略
 * 凡是根据上下文推导出来的内容,都可以省略书写
 * 可以省略的内容:
 * 1.(参数列表):括号中参数列表的数据类型,可以省略不写
 *
 * 2.(参数列表):括号中的参数如果只有一个,那么类型和()都可以省略
 *
 * 3.{一些代码}:如果{}中的代码只有一行,无论是否有返回值,都可以省略({},return,分号)
 *          注意:要省略{},return,分号 必须一起省略
 */

大结局 使用lambda 前提

* Lambda的语法非常简洁,完全没有面向对象复杂的约束。但是使用时有几个问题需要特别注意:

* 1.使用Lambda必须具有接口,且要求接口中 有且仅有一个抽象方法。

* 无论是JDK内置的Runnable、Comparator接口还是自定义的接口,只有当接口中的抽象方法存在且唯一时,才可以使用Lambda。

* 2.使用Lambda必须具有"上下文推断"。

* 也就是方法的参数或局部变量类型必须为Lambda对应的接口类塑,才能使用Lambda作为该接口的实例。

* 备注:有且仅有 一个抽象方法的 接口,称为函数式接口。

posted on 2019-05-14 18:03  Indian_Mysore  阅读(278)  评论(0编辑  收藏  举报

导航