lambda 表达式(1)

 

package haust.vk.lambda;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import org.junit.Test;

import com.google.common.base.Strings;
import com.google.common.collect.Lists;
/*
 * lambda表达式:一段带有输入参数的可执行语句块。
 * 这里的事例接住了google提供的guava组件
 */
public class Test1 {
	
	@Test
	public void test1() {
		List<String> names = new ArrayList<String>();
		names.add("ali");
		names.add("taobao");
		names.add("ali");
		Collections.sort(names, (o1, o2) -> o1.compareTo(o2));
		for(String name : names) {
			System.out.println(name);
		}
	}
	
	@Test
	public void test2() throws Exception {
		//这里省略list的构造
		List<String> names = new ArrayList<String>();
		names.add("ali");
		names.add("taobao");
		names.add("ali");
		Collections.sort(names, new Comparator<String>() {
		  @Override
		  public int compare(String o1, String o2) {
		    return o1.compareTo(o2);
		  }
		});
		
		for(String name : names) {
			System.out.println(name);
		}
	}
	
	//map方法就是接受了一个lambda表达式(其实是一个java.util.function.Function的实例
	@Test
	public void test3() throws Exception {
		List<String> names = new ArrayList<String>();
		names.add("aAAli");
		names.add("DStaobao");
		names.add("aSAsli");
		//完整写法
		//List<String> collect = names.stream().map((String name) -> {return name.toLowerCase();}).collect(Collectors.toList());
		//简化写法 当lambda表达式的参数个数只有一个,可以省略小括号。lambda表达式简写为:
		//List<String> collect = names.stream().map( name -> {return name.toLowerCase();}).collect(Collectors.toList());
		//简化写法   当lambda表达式只包含一条语句时,可以省略大括号、return和语句结尾的分号。lambda表达式简化为: param1 -> statment
		//List<String> collect = names.stream().map(name -> name.toLowerCase()).collect(Collectors.toList());
		//简化写法  Method Reference
		List<String> collect = names.stream().map(String::toLowerCase).collect(Collectors.toList());
		for(String name : collect) {
			System.out.println(name);
		}
	}
	
	/*
	   lambda表达式:
	   	输入参数
		可执行语句
		存放外部变量的空间
	   @throws Exception
	 */
	@Test
	public void test4() throws Exception {
		String[] a = {"a","b","c"};
		for(Integer i : Lists.newArrayList(1,2,3)) {
			/*
			 * map中的lambda表达式访问外部变量Integer i
			 */
			Stream.of(a).map( item -> Strings.padEnd(item, i, '@')).forEach(System.out::println);
			//不过lambda表达式访问外部变量有一个非常重要的限制:变量不可变(只是引用不可变,而不是真正的不可变)。
			//此处编译会报异常 因为变量k被lambda表达式引用,所以编译器会隐式的把其当成final来处理
			/*
			for(int k = 1; k<4; k++){
				  Stream.of(a).map(item -> Strings.padEnd(item, k, '@')).forEach(System.out::println);
			}
			*/
			//注意:java8之前的匿名内部类在访问外部变量的时候,外部变量必须用final修饰。
			//java8之后:对这个限制做了优化(前面说的小小优化),可以不用显示使用final修饰,但是编译器隐式当成final来处理。
		}
	}
	
	//在lambda中,this不是指向lambda表达式产生的那个SAM对象,而是声明它的外部对象。
	/*
	 * 方法引用语法格式有以下三种:
	 * 	objectName::instanceMethod
	 *  ClassName::staticMethod
	 *  前两种方式类似,等同于把lambda表达式的参数直接当成instanceMethod|staticMethod的参数来调用。
	 *  比如System.out::println等同于x->System.out.println(x);Math::max等同于(x, y)->Math.max(x,y)。
	 *  ClassName::instanceMethod
	 *  等同于把lambda表达式的第一个参数当成instanceMethod的目标对象,其他剩余参数当成该方法的参数。
	 *  比如String::toLowerCase等同于x->x.toLowerCase()。
	 */
	
	/*
	 * 构造器引用语法如下:ClassName::new,把lambda表达式的参数当成ClassName构造器的参数 。
	 * 例如BigDecimal::new等同于x->new BigDecimal(x)。
	 */
}

 

转载于:https://my.oschina.net/viakiba/blog/821002

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值