写在前面
IDEA都默认是jdk11了,我这还写着jdk8的新特性呢,惭愧惭愧。其实在学校的时候,基本没咋用过Lambda表达式和Stream流式编程,但是在实习的时候,发现公司的代码好多这样写的,没办法,总结一下吧。
Lambda表达式
首先我们得搞明白,Lambda表达式的作用,它主要是用来对集合的操作或者是对函数式接口的操作,所谓函数式接口,也就是只有一个方法的接口,通常用@FunctionInterface来标注。
先说说语法
Lambda表达式的语法很简单,就是() -> {},然后有一个操作,能省就省,也就是说,如果()里只有一个参数,那么可以不带(),同理,如果{}里只有一句话,也可以省略{},当然不省略也可以。
对List集合遍历
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.forEach(s -> {
System.out.println(s);
});
对map集合遍历
Map<String, String> map = new HashMap<>();
map.put("a", "aaa");
map.put("b", "bbb");
map.put("c", "ccc");
map.forEach((k, v) -> {
System.out.println(k + "===" + v);
});
对函数式接口的操作
定义一个无返回值无参数的函数式接口
@FunctionalInterface
public interface GetHelloWorld {
void getHelloWorld();
}
实现
GetHelloWorld getHelloWorld = () -> {
System.out.println("hello world");
};
getHelloWorld.getHelloWorld();
定义一个有返回值有参数的
@FunctionalInterface
public interface GetHelloWorld {
int getHelloWorld(int a, int b);
}
实现
GetHelloWorld getHelloWorld = (a, b) -> {
System.out.println("hello world");
return a + b;
};
System.out.println(getHelloWorld.getHelloWorld(1, 2));
再举一个创建线程的例子
Runnable runnable = () -> {
System.out.println("hello world");
};
new Thread(runnable).start();
// 等价于上面的操作
new Thread(() -> {
System.out.println("hello world");
}).start();
lambda表达式就暂时说这么多,下面说说Stream流式编程。
Stream流式编程
流式编程一共分为三个阶段,一是创建流(集合通过.stream()方法可以创建流),二是执行中间操作,三是执行最终操作,流式编程一般是对集合的操作。
案例一
例如我们对集合元素进行去重
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("bbb");
list.add("ccc");
Stream<String> stream = list.stream();
stream.distinct().forEach(s -> System.out.println(s));
案例二
对集合进行过滤
List<Integer> list = new ArrayList<>();
list.add(20);
list.add(18);
list.add(25);
list.add(16);
Stream<Integer> stream = list.stream();
stream.filter(x -> x >= 20).forEach(s -> System.out.println(s));
案例三
对集合排序,默认是从小到大,这里演示从大到小
List<Integer> list = new ArrayList<>();
list.add(20);
list.add(18);
list.add(25);
list.add(16);
Stream<Integer> stream = list.stream();
stream.sorted((x, y) -> y - x).forEach(s -> System.out.println(s));
案例四
对集合做映射输出
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("bbb");
list.add("zzz");
list.add("ddd");
Stream<String> stream = list.stream();
stream.map(s -> s.length()).forEach(s -> System.out.println(s));
案例五
对集合去重后数量统计
List<Integer> list = new ArrayList<>();
list.add(22);
list.add(13);
list.add(15);
list.add(15);
Stream<Integer> stream = list.stream();
long count = stream.distinct().parallel().count();
System.out.println(count);
到这里应该能感受到流式编程了吧,其实就是有很多骚操作我们可以直接调用,减少了代码量,提高了开发效率,当然流式编程不止这么些操作,还有其他的,感兴趣的可以研究一下。