java 8 函数式编程
函数式编程
1. Lambda 表达式
1.1 概念
对某些匿名内部类的写法优化,特点是可推导可省略。基本格式:(参数列表) -> {代码}。
- 例如:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("运行进程");
}
}).start();
就可以优化为
new Thread(() -> System.out.println("运行进程")).start();
优化规则可以不记,使用Idea快捷键Alt+Enter可以自动优化写法。
2. Stream 流
2.1 概述
java8的Stream使用的是函数式编程,可以对集合或者数组进行链状流式的操作。
2.2 常用操作
2.2.1 创建流
- 单列集合:集合对象.stream()。实际开发用的最多
- 数组对象:Arrays.stream(数组)或者Stream.of(数组)
- 双列集合:转换成单列集合后在创建流。例如:
HashMap<String, String> map = new HashMap<>();
map.put("a","A");
map.put("b","B");
map.put("c","C");
Stream<Map.Entry<String, String>> stream = map.entrySet().stream();
流对象的泛型对象就是集合的泛型对象
2.2.2 中间操作
a. filter
过滤操作,符合条件才能保留在流当中。
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.stream().filter((item) -> item.startsWith("a")).forEach((item) -> System.out.println(item));// a开头的才能留在流当中
输出结果:
abc
acd
b. map
对流当中的元素计算或者转换。
List<String> list = new ArrayList<>();
list.add("abc");
list.add("bcd");
list.add("acd");
list.stream().map(item->item.toCharArray()).forEach(item-> System.out.println(item.length));//String转换成char数组
list.stream().map(s->s+"**").forEach(s-> System.out.println(s));//每个元素增加**
输出:
3
3
3
abc**
bcd**
acd**
c. distinct
去重:需要流当中的元素重写hashCode和equals方法。
List<String> list = new ArrayList<>();
list.add("abc");
list.add("bcd");
list.add("acd");
list.add("acd");
list.stream().distinct().forEach(s-> System.out.println(s));//输出:abc bcd acd
d. sorted
对流中的元素排序:该方法俩个重载方法可以在sorted中通过入参匿名内部类定义比较 也可以流中的元素本身实现Comparator接口
List<String> list = new ArrayList<>();
list.add("abc");
list.add("bcd");
list.add("acd");
list.add("acd");
list.stream().sorted().forEach(s-> System.out.println(s));