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 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 m = new HashMap();
		m.put(1, "hahaha");
		m.put(2, "233333");
		
		m.forEach((k,v)->System.out.println(k+" : "+v));

 

 

二、Stream

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

jdk1.8新特性_第1张图片

                List 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 list2 = list.stream().map(s->s*s).collect(Collectors.toList());

 

你可能感兴趣的:(你模糊的java基础)