jdk1.8新特性

一、lambda表达式

在引出lambda表达式之前,先定义一个简单的例子,cat类来实现talk接口

interface Talk{
	public void say();
}
public class Cat implements Talk{

	@Override
	public void say() {
		// TODO Auto-generated method stub
		System.out.println("this Cat miao miao miao");
	}
	
	public static void main(String[] args) {
		new Cat().say();				
	}

}

这是最简单的一个例子,那么问题来了,如果我此时想来一个dog类,也实现Talk接口,但是我只是想用一次这个dog类,觉得定义类、再实现接口实在太麻烦了,有没有更简单的方式呢?

匿名实现类怎么样?

    public static void main(String[] args) {
		Talk dog = new Talk() {
			
			@Override
			public void say() {
				// TODO Auto-generated method stub
				System.out.println("this dog wang wang wang");
			}
		};
		
		dog.say();
	}

相对来说,比前者简单,但是有没有发现,我建类、实现接口、重写方法。。其实我的目的很纯粹,就是让一个新类dog实现Talk接口,而实现Talk的唯一目的又仅是实现say方法,所以是我们自己定义的代码和真正想用到的代码就一句,就是一句,就是定义在say方法里的System.out.println("this dog wang wang wang");

那么,有没有更简单的方式能够实现呢?Lambda表达式就出现了

       public static void main(String[] args) {
		
		//1.接口里要有且仅有一个函数(不然谁知道你在定义哪个方法呢?),这被称为函数式接口
		//2.接口要加函数式接口的注解@FunctionalInterface(但是我发现没写这个注解也行)
		//3.()代表将要实现的方法里的参数列表
		//4.->后面写方法主体内容
		
		Talk pig = ()->System.out.println("this pig heng heng heng");
		pig.say();
		
		
	}

我们再来体验下它的强大

                //新建一个线程,快速创建runnable接口传入
		new Thread(()->System.out.println("I'am a runnable interface")).start();
		
		//集合工具类的自动排序,快速创建comparator传入
		List<Integer> asList = Arrays.asList(1,2,4,3,15,6);
		Collections.sort(asList, (o1,o2)->o2-o1);
		
		
		//快速遍历list集合
		asList.forEach((t)->System.out.println(t));
		asList.forEach(System.out::println);
		
		//快速遍历map集合
		Map<Integer, String> m = new HashMap<Integer, String>();
		m.put(1, "hahaha");
		m.put(2, "233333");
		
		m.forEach((k,v)->System.out.println(k+" : "+v));

 

 

二、Stream

Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。以下只是部分例子,更多详细请点击菜鸟教程

                List<Integer> list = Arrays.asList(23,34,45,14,35,97,10,87,52);
		list.stream().forEach(System.out::println);//遍历
		
		//1.过滤 		
		//打印大于30的		
		for(Integer i:list) {//一般写法
			if(i>30) System.out.println(i);
		}
		
		list.stream().filter(s->s>30).forEach(System.out::println);//stream写法
		
		//大于30的前两个		limit(int i)取几个
		list.stream().filter(s->s>30).limit(2).forEach(System.out::println);
		
		//大于30的最大的三个	sorted(comparator)按规则排序
		list.stream().filter(s->s>30).sorted((o1,o2)->o2-o1).limit(3).forEach(System.out::println);
	
	
		//2.去重 disctinct
		list.stream().distinct();
		
		//3.聚合  求所有元素之和
		Integer sum = list.stream().reduce((o1,o2)->o1+o2).get();
		
		//求集合中的最大值
		Integer max = list.stream().reduce((o1,o2)->o1>o2?o1:o2).get();
		
		//把每一个数的平方放到一个新的集合中
		List<Integer> list2 = list.stream().map(s->s*s).collect(Collectors.toList());

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值