一、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,可以让你以一种声明的方式处理数据。以下只是部分例子,更多详细请点击菜鸟教程
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());