Java8新特性之Lambda,方法引用,Stream

Java8新特性之Lambda,方法引用

First:Lambda表达式

一.什么是函数式编程
1.函数式编程是种编程方式,它将电脑运算视为函数的计算。

2.函数式编程的优缺点
优点: 代码简洁,开发快速。
缺点:函数式编程常被认为严重耗费在CPU和存储器资源。

二.什么是Lambda
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
1.Lambda表达式的优缺点
优点:少量的代码就能替代以前的一大堆循环判断过滤等,代码简洁。
缺点:
a.用Lambda充当匿名内部类、方法引用等场合效率低。
b.Lambda的特点还在于开发成本高,并且异常难以排查。

2.Lambda表达式的语法
第一部分为一个括号内用逗号分隔的形式参数,参数是函数式接口里面方法的参数;
第二部分为一个箭头符号:->;
第三部分为方法体,可以是表达式和代码块。
方法体分类:
1. 方法体为表达式,该表达式的值作为返回值返回。
(parameters) -> expression
实例:
//求和
(int a,int b) -> return a + b;
2. 方法体为代码块,必须用 {} 来包裹起来。 而有无return,全看实现的接口是否需要return。

3.Lambda表达式的重要特征
a.可选类型声明:不需要声明参数类型,编译器可以统一识别
b.可选的参数圆括号:一个参数无需定义圆括号
c.可选的大括号:代码块只包含一个语句,不用大括号
d.可选的返回关键字:
如果主体只有一个表达式则不用return
如果用大括号,则必须使用return
详见代码:

package cn.ftf.thread;
/**
 * lambda表达式带参数,有返回值
 * @author房廷飞
 *
 */
public class LambdaTest04 {
    public static void main(String[] args) {
        ILove love=(int a,int b)->{    //可以省略int,自定跟接口匹配。只有一个参数的时候()也可以省略,如果只有一行代码,{ }也可以省略!  
            System.out.println("i love lambda  "+(a+b));
            return a+b;
        };
        System.out.println(love.lambda(100,200));
    } 
}
interface ILove{
    int lambda(int a,int b);
}

4.Lambda表达式的底层实现
java8内部Lambda表达式的实现方式在本质是以匿名内部类的形式的实现的。

5.Lambda表达式的函数式接口
函数式接口(Functional Interface)是Java 8对一类特殊类型的接口的称呼。这类接口只定义了唯一的抽象方法的接口(除了隐含的Object对象的公共方法)
注:说白了,只要是只有一个方法的接口,都算可以使用函数式编程

三.Lambda具体应用场景
1.使用() -> {} 替代匿名类
2.以流水线的方式处理数据
3.数据并行处理
4. 用内部迭代取代外部迭代
注:2,3,4都是结合Stream使用的,详见参考链接

四.其他注意事项
4.1 lambda表达式可访问外部变量

//将为列表中的字符串添加前缀字符串
String outstr= "lambda :";
List<String> proStrs = Arrays.asList(new String[]{"Ni","Hao","Lambda"});
List<String>execStrs = proStrs.stream().map(proStr -> outstr+ proStr).collect(Collectors.toList());
execStrs.forEach(System.out::println);

输出:

lambda :Ni
lambda :Hao
lambda :Lambda

当在表达式内部修改outstr= outstr+ " ";时,IDE就会提示你:
Local variable waibu defined in an enclosing scope must be final or effectively final
因为变量outstr被lambda表达式引用,所以编译器会隐式的把其当成final来处理。

4.2lambda表达式中的this概念
在lambda中,this不是指向声明它的外部对象。
详见:https://blog.csdn.net/wqbs369/article/details/82870957

Second:方法引用和构造器引用

一、方法引用
三种方式:
objectName::instanceMethod

ClassName::staticMethod
例子:System.out::println等同于x->System.out.println(x)

ClassName::instanceMethod
例子:String::toLowerCase等同于x->x.toLowerCase()

注:前两种是将传入对象当参数执行方法,后一种是调用传入对象的方法。

二、构造器引用(知道即可,一般不这么写)
例子:BigDecimal::new等同于x->new BigDecimal(x)。

参考链接:
https://blog.csdn.net/kwame211/article/details/87972041
https://www.cnblogs.com/fangtingfei/p/11248367.html
https://blog.csdn.net/wqbs369/article/details/82870957

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值