Java Lambda表达式学习-1

背景介绍

  • Lambda是JAVA SE8中的一个重要的新特性,允许使用表达式来代替功能接口,提供了一个正常的参数列表和一个使用这些参数的主题(可以是一个表达式或者一个代码块).例如代替匿名内部类,Runnable.

基本语法:

(parameters)->expression    /*表达式*/
(parameters)->{statements}  /*代码块*/
/-------简单示例------------/
()->a  //不需要参数,返回a
a->2*a //接受一个参数(int类型),返回其与2的乘积,一个参数已不写括号
(x, y) ->x-y //接受x,y参数,返回两者的差,虽然编译器会去自动推导类型,但最好还是自己将类型加上
  • 简单例子,Lambda表达式代替new 匿名内部类:
public interface TestLambda {
    void test(int x);
}

public class TestLambdaImpl {
    public void func(TestLambda test) {
        test.test(10);
    }
}

public void testFunc() {
    TestLambdaImpl t = new TestLambdaImpl();
    //普通匿名内部类写法
    t.func(new TestLambda() {
        @Override
        public void test(int x) {
            System.out.println(x);
        }
    });
    //Lambda表达式,实现了接口的方法,变得更加简洁,等于在在此处就实现了接口的方法
    t.func((int x)->System.out.println(x));//表达式
    t.func((int x)->{
        System.out.println(x);
        System.out.println("I am your father!");});//代码块
}
  • 例子2 for循环
String[] atp = {"Rafael Nadal", "Novak Djokovic",  
       "Stanislas Wawrinka",  
       "David Ferrer","Roger Federer",  
       "Andy Murray","Tomas Berdych",  
       "Juan Martin Del Potro"};
List<String> list = Arrays.asList(atp);
//以前的循环方式
for(String player : list) {
    System.out.println(player);
}

//Lambda表达式
list.forEach((String s)->System.out.println(s));
  • 例子3:Runnable接口
//使用匿名内部类
new Thread(newRunnbale() {
    @Override
    public void run() {
        System.out.println("hello world");
    }
});

Runnable r1 = new Runnable() {
    @Override
    public void run() {
        System.out.println("hello world");
    }
};

//Lambda表达式
new Thread(()->System.out.println("hello world"));

Runnable r2 = ()->System.out.println("hello world");
new Thread(r2);
  • 例子4:集合的排序
String[] players =  {"Rafael Nadal", "Novak Djokovic",  
       "Stanislas Wawrinka",  
       "David Ferrer","Roger Federer",  
       "Andy Murray","Tomas Berdych",  
       "Juan Martin Del Potro"};
//匿名内部类排序
Arrays.sort(players, new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        return (s1.compareTo(s2));//从大到小的排序
    }
});
//Lambda表达式
Comparator<String> comparator = (String s1, String s2) -> s1.compareTo(s2);
Arrays.sort(player, comparator);
Arrays.sort(players, (String s1, String s2) -> return s1.compareTo(s2));

使用Lambdas和Streams

  • Stream是对集合的包装,通常与Lambda一起使用,支持多种操作,如 map, filter, limit, sorted, count, min, max, sum, collect 等等。
  • 代码
public class Person {
    private String firstName, lastName, job, gender;
    private int salary, age;
    public Person(String firstName, String lastName, String job, String gender, int age, int salary) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.job = job;
        this.gender = gender;
        this.age = age;
        this.salary = salary;
    }
}

List<Person> javaProgrammers = new ArrayList<Person>() {  
  {  
    add(new Person("Elsdon", "Jaycob", "Java programmer", "male", 43, 2000));  
    add(new Person("Tamsen", "Brittany", "Java programmer", "female", 23, 1500));  
    add(new Person("Floyd", "Donny", "Java programmer", "male", 33, 1800));  
    add(new Person("Sindy", "Jonie", "Java programmer", "female", 32, 1600));  
    add(new Person("Vere", "Hervey", "Java programmer", "male", 22, 1200));  
    add(new Person("Maude", "Jaimie", "Java programmer", "female", 27, 1900));  
    add(new Person("Shawn", "Randall", "Java programmer", "male", 30, 2300));  
    add(new Person("Jayden", "Corrina", "Java programmer", "female", 35, 1700));  
    add(new Person("Palmer", "Dene", "Java programmer", "male", 33, 2000));  
    add(new Person("Addison", "Pam", "Java programmer", "female", 34, 1300));  
  }  
}; 

List<Person> phpProgrammers = new ArrayList<Person>() {  
  {  
    add(new Person("Jarrod", "Pace", "PHP programmer", "male", 34, 1550));  
    add(new Person("Clarette", "Cicely", "PHP programmer", "female", 23, 1200));  
    add(new Person("Victor", "Channing", "PHP programmer", "male", 32, 1600));  
    add(new Person("Tori", "Sheryl", "PHP programmer", "female", 21, 1000));  
    add(new Person("Osborne", "Shad", "PHP programmer", "male", 32, 1100));  
    add(new Person("Rosalind", "Layla", "PHP programmer", "female", 25, 1300));  
    add(new Person("Fraser", "Hewie", "PHP programmer", "male", 36, 1100));  
    add(new Person("Quinn", "Tamara", "PHP programmer", "female", 21, 1000));  
    add(new Person("Alvin", "Lance", "PHP programmer", "male", 38, 1600));  
    add(new Person("Evonne", "Shari", "PHP programmer", "female", 40, 1800));  
  }  
}; 

//lambda 表达式
//forEach
javaProgrammers.forEach((List<Person> p)->System.out.println("FirstName:"p.getFirstName() + ", LastName:" + p.getLastName()));

phpProgrammers.forEach((List<Person> p)->System.out.println("FirstName:"p.getFirstName() + ", LastName:" + p.getLastName()));

//过滤器filter
phpProgrammers.stream().filter((List<Person> p)->(p->getSalary()>1000))
                                          .forEach((List<Person> p)->System.out.println("FirstName:"p.getFirstName() + ", LastName:" + p.getLastName()));

//限制器limit
phpProgrammers.stream().filter((List<Person> p)->(p->getSalary()>1000))
                                          .limit(3)
                                          .forEach((List<Person> p)->System.out.println("FirstName:"p.getFirstName() + ", LastName:" + p.getLastName()));

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

推荐阅读更多精彩内容