java8的λ(lambda)表达式与Stream API

一、λ(lambda)表达式学习

Java8最值得学习的特性就是Lambda表达式和Stream API,如果有python或者javascript的语言基础,对理解Lambda表达式有很大帮助,因为Java正在将自己变的更高级,更人性化。--------可以这么说lambda表达式其实就是实现SAM接口的语法糖。--引用其他博主

函数式编程:<font size="4" color="#53868B">“函数式接口”是指仅仅只包含一个抽象方法的接口,每一个该类型的lambda表达式都会被匹配到这个抽象方法。jdk1.8提供了一个@FunctionalInterface注解来定义函数式接口,如果我们定义的接口不符合函数式的规范便会报错。</font>

@FunctionalInterface
public interface Test {
    //只有一个抽象方法
    public void helloWorld(String y);
}
//方法体自己搞 -> λ用法
Test t = y -> System.out.println("HelloWorld!!!"+y);
<font color="#76EEC6">玩一玩</font>,<font color="##A2CD5A">搞一搞</font>
1、线程

大家都爱拿线程举例子:
普通创建一个线程:

Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("这是个线程");
            }
        });
        //启动线程
        thread.start();

λ用法:

Thread thread1 = new Thread(() -> System.out.println("这是个线程"));
        thread1.start();
2、排序(大家都来拿它举例子)

普通玩法:

List<String> list = Arrays.asList(new String[] {"1","103","201","3","204","32","13"});
        Collections.sort(list, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return  o1.compareTo(o2);
            }
        });
        System.out.println(list.toString());

//执行结果(附带上一些String排序的小知识)
[1, 103, 13, 201, 204, 3, 32]

λ玩法:

 List<String> list = Arrays.asList(new String[] {"1","103","201","3","204","32","13"});
        /*Collections.sort(list, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return  o1.compareTo(o2);
            }
        });*/
        Collections.sort(list,(string1,string2) -> string1.compareTo(string2));
        System.out.println(list.toString());
//执行结果:
[1, 103, 13, 201, 204, 3, 32]

执行效率分析:

根据排序进行了如下效率分析:

    public static void main(String[] args) {
        List<String> list = Arrays.asList(new String[] {"1","103","201","3","204","32","13","103","201","3","204","32","13","103","201","3","204","32","13","103","201","3","204","32","13","103","201","3","204","32","13","103","201","3","204","32","13","103","201","3","204","32","13","103","201","3","204","32","13","103","201","3","204","32","13"});
        //执行效率分析
        for(int i=1;i<=100;i++){
            long startTime = System.currentTimeMillis();
            for(int j=1;j<=10000;j++){
                Collections.sort(list, new Comparator<String>() {
                    @Override
                    public int compare(String o1, String o2) {
                        return  o1.compareTo(o2);
                    }
                });
            }
            long endTime = System.currentTimeMillis();
            System.out.println("第"+i+"次普通排序执行时间:"+(endTime-startTime));
            startTime = System.currentTimeMillis();
            for(int j=1;j<=10000;j++){
                Collections.sort(list,(string1,string2) -> string1.compareTo(string2));
            }
            endTime = System.currentTimeMillis();
            System.out.println("第"+i+"次lambda排序执行时间:"+(endTime-startTime));

        }
    }

执行了100次,取中间20个做分析:

第40次普通排序执行时间:5
第40次lambda排序执行时间:6
第41次普通排序执行时间:6
第41次lambda排序执行时间:5
第42次普通排序执行时间:6
第42次lambda排序执行时间:6
第43次普通排序执行时间:5
第43次lambda排序执行时间:7
第44次普通排序执行时间:6
第44次lambda排序执行时间:6
第45次普通排序执行时间:6
第45次lambda排序执行时间:8
第46次普通排序执行时间:6
第46次lambda排序执行时间:6
第47次普通排序执行时间:11
第47次lambda排序执行时间:7
第48次普通排序执行时间:6
第48次lambda排序执行时间:17
第49次普通排序执行时间:6
第49次lambda排序执行时间:9
第50次普通排序执行时间:7
第50次lambda排序执行时间:7
第51次普通排序执行时间:7
第51次lambda排序执行时间:10
第52次普通排序执行时间:9
第52次lambda排序执行时间:7
第53次普通排序执行时间:8
第53次lambda排序执行时间:7
第54次普通排序执行时间:6
第54次lambda排序执行时间:7
第55次普通排序执行时间:7
第55次lambda排序执行时间:6
第56次普通排序执行时间:8
第56次lambda排序执行时间:8
第57次普通排序执行时间:8
第57次lambda排序执行时间:9
第58次普通排序执行时间:9
第58次lambda排序执行时间:17
第59次普通排序执行时间:8
第59次lambda排序执行时间:10

其中:λ>普通为10次,普通>λ为5次,相等为5次
可能力度不够,将10000调整为100000看看

第40次普通排序执行时间:54
第40次lambda排序执行时间:52
第41次普通排序执行时间:53
第41次lambda排序执行时间:55
第42次普通排序执行时间:52
第42次lambda排序执行时间:52
第43次普通排序执行时间:53
第43次lambda排序执行时间:55
第44次普通排序执行时间:55
第44次lambda排序执行时间:55
第45次普通排序执行时间:58
第45次lambda排序执行时间:59
第46次普通排序执行时间:53
第46次lambda排序执行时间:53
第47次普通排序执行时间:52
第47次lambda排序执行时间:53
第48次普通排序执行时间:57
第48次lambda排序执行时间:55
第49次普通排序执行时间:52
第49次lambda排序执行时间:63
第50次普通排序执行时间:55
第50次lambda排序执行时间:54
第51次普通排序执行时间:51
第51次lambda排序执行时间:54
第52次普通排序执行时间:53
第52次lambda排序执行时间:54
第53次普通排序执行时间:52
第53次lambda排序执行时间:57
第54次普通排序执行时间:61
第54次lambda排序执行时间:60
第55次普通排序执行时间:54
第55次lambda排序执行时间:61
第56次普通排序执行时间:51
第56次lambda排序执行时间:53
第57次普通排序执行时间:54
第57次lambda排序执行时间:59
第58次普通排序执行时间:59
第58次lambda排序执行时间:62
第59次普通排序执行时间:54
第59次lambda排序执行时间:60

将100000调整为1000000看看

第40次普通排序执行时间:564
第40次lambda排序执行时间:586
第41次普通排序执行时间:576
第41次lambda排序执行时间:557
第42次普通排序执行时间:569
第42次lambda排序执行时间:586
第43次普通排序执行时间:599
第43次lambda排序执行时间:582
第44次普通排序执行时间:559
第44次lambda排序执行时间:572
第45次普通排序执行时间:580
第45次lambda排序执行时间:588
第46次普通排序执行时间:578
第46次lambda排序执行时间:572
第47次普通排序执行时间:580
第47次lambda排序执行时间:557
第48次普通排序执行时间:579
第48次lambda排序执行时间:620
第49次普通排序执行时间:582
第49次lambda排序执行时间:606
第50次普通排序执行时间:613
第50次lambda排序执行时间:624
第51次普通排序执行时间:583
第51次lambda排序执行时间:581
第52次普通排序执行时间:653
第52次lambda排序执行时间:683
第53次普通排序执行时间:688
第53次lambda排序执行时间:699
第54次普通排序执行时间:690
第54次lambda排序执行时间:693
第55次普通排序执行时间:573
第55次lambda排序执行时间:707
第56次普通排序执行时间:785
第56次lambda排序执行时间:563
第57次普通排序执行时间:593
第57次lambda排序执行时间:597
第58次普通排序执行时间:561
第58次lambda排序执行时间:568
第59次普通排序执行时间:688
第59次lambda排序执行时间:585

差别其实没有太大

二、Stream (原理很深奥,用法很简单)

同样是,我们先学会骑自行车,再去研究轮子,再去造轮子

Stream是Java 8中的一个大的改进。Stream的功能是,支持集合的各种操作,比如filter, sum, max, min, average, map, reduce等等。
它可以:增强集合操作
拥抱函数式编程
充分利用Lambda
执行效率的提高 - 透明支持多线程集合操作

<font color="#76EEC6">玩一玩</font>,<font color="##A2CD5A">搞一搞</font>

首先new了一个学生实体类:

public class Student implements Serializable {
    private long id;
    private String name;
    private String sex;
    private int age;
    private String remore;
    //setter And getter方法
}

然后写了一个setListValue方法来给list赋值

    public static void setListValue(List list){
        for(int i=0;i<1000;i++){
            Student student = new Student();
            student.setAge(10+(i/100));
            student.setId(i);
            student.setName("啊"+i);
            student.setRemore("这是个"+i);
            student.setSex(String.valueOf(i%2));
            list.add(student);
        }
    }

一、使用stream来进行排序

根据id正序正序

        //根据id正序
        list.stream().sorted(Comparator.comparing(Student::getId)).collect(Collectors.toList());

根据id正序逆序

list.stream().sorted(Comparator.comparing(Student::getId).reversed()).collect(Collectors.toList());

拿出实体复合条件的属性并吧该属性单独放到一个容器中

        List<String> oldMan = list.stream().filter(student -> student.getAge() > 18).map(Student::getName).collect(Collectors.toList());
        System.out.println(oldMan);

filter做过滤

        list.stream().filter(student -> student.getAge()>18).collect(Collectors.toList()).forEach(student -> {
            //a="qwer";
            student.setName("呦呦呦");
        });

forech循环

        List<String> addF=new ArrayList<>();
        //得到其中所有的Name属性并赋值给addF
        addF=list.stream().map(Student::getName).collect(Collectors.toList());
        addF.stream().forEach(name ->{
            //做一些逻辑
            if(name.contains("啊")){
               
            }
        });

注意:

<font size ="4" color="#CD7054"><b>forech循环这个里面有点限制,在这个forech循环外命名的变量没有办法在forech循环里面使用,若想使用,必须定义成常量</font>

再更

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

推荐阅读更多精彩内容