Lambda表达式入门

Lambda表达式带来了函数式编程的思想。面向对象编程是对数据进行抽象,而函数式编程是对行为进行抽象。

一、Lambda表达式的优点:

1.类库的开发者使用Java时,抽象的级别还不够。处理大数据就是个很好的例子,面对大数据,Java还欠缺高效的并行操作。Java 8允许开发者编写复杂的集合处理算法,只需要简单修改一个方法,就能让代码在多核CPU上高效运行。为了编写并行处理这些大数据的类库,需要在语言层面上修改现有的Java:增加lambda表达式。开发企业级应用时,好的类库和框架极大地降低了开发时间和成本,也扫清了开发易用且高效的类库的障碍。

2.利用Lambda表达式程序员能编写出更容易阅读的代码——这种代码更多地表达了业务逻辑,而不是从机制上如何实现。易读的代码也易于维护、更可靠、更不容易出错。

3.在写回调函数和事件处理器时,程序员不必再纠缠于匿名内部类的冗繁和可读性,函数式编程让事件处理系统变得更加简单。能将函数方便地传递也让编写惰性代码变得容易,只有在真正需要的时候,才初始化变量的值。

4.lambda最差的情况性能内部类一样, 好的情况会更好。

二、Lambda表达式的缺点:

Lambda表达式是代码变得精简,但是当出错时,出错栈信息太长

三、Lambada的应用场景

1.使用()->{}替代匿名类

<span style="font-size:14px;"> <span style="white-space:pre">	</span>//原来的Android中的方法
        btClcik.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.e(TAG,"normal click.................");
            }
        });

        //使用Lambda表达式后的方法
        btClcik.setOnClickListener((view)->{
            Log.e(TAG,"use lambada expressions  click.................");
        });</span>

2.使用内循环替代外循环

Lambda表达式的优点:

外循环:描述怎么干,代码里嵌套2个以上的for循环的都比较难读懂;只能顺序处理List中的元素;

内循环:描述要干什么,而不是怎么干;不一定需要顺序处理List中的元素

<span style="font-size:14px;"> List<String> items = Arrays.asList("lambada1","lambada2","lambada3","lambada4","lambada5");

        //java中的方法
        for(String item: items){
            Log.e(TAG,"normal recycle................."+item);
        }

        //括号中第一个字母item是所需参数的名字,可以随便写,获取值时也需要和这个变量名对应
        items.forEach(item -> Log.e(TAG,"lambada expression ..........."+item));</span>


forEach一直提示需要API24,即运行在7.0上,否则方法运行总是报错Lambda表达式的优点:
java.lang.NoClassDefFoundError: test.lambda.com.MainActivity$$Lambda$1。

除了不在7.0及其之上运行,不知道其它的解决办法是什么


3.函数式编程

就是方法中的参数可以是函数

<span style="font-size:14px;">   List<String> items = Arrays.asList("lambada7", "lambada6", "lambada8", "lambada9", "lambada10");
        items.stream().filter((item) -> (item.equalsIgnoreCase("lambada8'")))
                .forEach((name) -> {
                    System.out.println(name + " ");
        });</span>

4.用管道的方式处理数据

<span style="font-size:14px;">final BigDecimal totalOfDiscountedPrices = prices.stream()
.filter(price -> price.compareTo(BigDecimal.valueOf(20)) > 0)
.map(price -> price.multiply(BigDecimal.valueOf(0.9)))
.reduce(BigDecimal.ZERO,BigDecimal::add);</span>


参考资料:https://wizardforcel.gitbooks.io/java8-tutorials/content/index.html

    https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值