java8 lambda学习 较详细

//
这是一篇从入门到进阶的lambda表达式的学习,罗列知识点较为齐全,适合作为参考

1、基础语法(参数列表、方法体)

	//lambda本质上是匿名函数,不关心方法名,返回值类型。lambda只在意参数列表和方法体本身,并通过->连接两者
	//                                                           ()   ->   {}	
	// 我这里先定义了如下四个接口(他们的参数和返回值不同),用他们来说明lambda具体使用时的区别
	LambdaNoneReturnMutipleParameter lambda2 = (int a,int b)->{System.out.println(a+b);};
	LambdaNoneReturnNoneParameter lambda1 = ()->System.out.println();//如果方法体只有一条语句,可以省略大括号;
	LambdaSingleReturnSingleParameter lambda3 = a->1;//如果接口中参数只有一个,可以省略括号。
																//如果方法体只有一条返回值语句,省略大括号;和return												
	LambdaSingleReturnMutipleParameter lambda4 = (a,b)->{return a+b;};//因为接口中已经定义了参数类型,可以省略
	
	
	//lambda里方法的引用:将lambda实现指向一个已实现的方法(解决lambda重复使用)
	LambdaSingleReturnSingleParameter lambda5 = a->change(a);//普通方法的引用
	LambdaSingleReturnSingleParameter lambda6 = TestLambda::change;//静态方法的引用
	//这里定义了一个person类
	PersonCreater creater = Person::new;//构造器的引用
	Person p = creater.getPerson("yyy",18);
	
	
	//在集合中的使用,一般是继承Comparator接口
	List<Integer> list = new ArrayList<>();
	TreeSet<Integer> set = new TreeSet<>( (o1,o2) -> o1-o2 );
	Collections.sort(list, (o1,o2)->{
		if(o1>o2) {
			return 1;
		}else {
			return -1;
		}
	});//如果o1比o2大就交换,实现list降序排列
	list.removeIf( ele -> ele>10 );//返回值为true则删除该元素


    //在线程中的使用
    new Thread(()-> {
		for(int i=0;i<20;i++) {
			System.out.println("数字数到:"+i);
		}
	}).start();

2、系统内置的一些函数式接口(常用的有Predicate,Consumer,Supplier, Function)

	/**
	 * BiPredicate<T,U>   参数T,U,返回值boolean 
	 * 		Predicate<T>       参数T,返回值boolean
	 * 		IntPredicate       参数int,返回值boolean
	 * 		LongPredicate      参数long,返回值boolean
	 * 		DoublePredicate    参数double,返回值boolean
	 */
		
	/**
	 * BiConsumer<T,U>    参数T,U,返回值void
	 * 		Consumer<T>        参数T,返回值void
	 * 		其余拓展同Predicate
	 */
	
	/**
	 * Supplier<T>        无参, 返回值T
	 * ...
	 */
	
	/**
	 * Function<T,R>      参数T,返回值R
	 * 		UnaryOperator      参数T,返回值T(继承自Function)
	 * 		IntFunction<R>     参数int,返回值R
	 * 		LongFunction<R>     参数long,返回值R
	 * 		DoubleFunction<R>     参数double,返回值R
	 * 		IntToLongFunction     参数int,返回值long
	 * 		...
	 */
	
	/**
	 * BiFunction<T,U,R>  参数T,U,返回值R
	 * 		BinaryOperator<T>  参数T,T,返回值T(继承自BiFunction)
	 */

3、闭包

 作用:提升变量的生命周期,可以获取方法中的局部变量
 在闭包中引用局部变量,系统使该变量为常量
 
 private static Supplier<Integer> getNumber(){
 	int num=10;
 	return ()->{
 		return num;  //在这个get方法中本来没办法获取到num的值
 	};
 }
 public static void main(String[] args){
 	int n = getNumber().get();
 }
 需要注意的是,lambda写在方法体内的参数会被系统默认为final,不能从方法体内改变外部变量的值
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值