概念:
面向对象思想需要关注用什么对象完成什么事情。而函数式编程思想就类似于我们数学中的函数。它主要关注的是对数据进行了什么操作。
Lambda表达式
Lambda是JDK8中一个语法糖。
他可以对匿名内部类的写法进行简化。它是函数式编程思想的一个重要体现。让我们不用关注什么是对象,而是更关注我们对数据做了什么操作。
核心原则:可推导可省略
如果参数的类型可以被推导出来,则参数类型可以省略
基本格式:(参数列表)->{代码}
Stream流
它可以被用来对集合或数组进行链状流式的操作。可以帮方、便的让我对集合或者数组操作。
创建流对象
List<Author> authors = getAuthors();
authors.stream()
.distinct()
.filter(author -> author.getAge()>18)
.forEach(author -> System.out.println(author.getName()));
Integer[]integers ={1,2,3,4,5,6,7,8};
Stream<Integer> stream = Arrays.stream(integers);
stream.distinct()
.filter(new Predicate<Integer>() {
@Override
public boolean test(Integer integer) {
return integer>5;
}
})
.forEach(new Consumer<Integer>() {
@Override
public void accept(Integer integer) {
System.out.println(integer);
}
});
Map<String,String>maps=new HashMap<String,String>();
// entrtSet把键值对封装为一个单列集合
Stream<Map.Entry<String, String>> stream1 = maps.entrySet().stream();
stream1.forEach(new Consumer<Map.Entry<String, String>>() {
@Override
public void accept(Map.Entry<String, String> stringStringEntry) {
System.out.println(stringStringEntry.getKey());
}
});
注意事项:
- 惰性求值(如果没有终结操作),那么中间操作是不会得到执行的
- 流是一次性的(一旦一个流对象经过一个终结操作后,这个流就不能再被使用)
- 不会影响原来数据(我们在流中可以对数据做很多处理。但是正常情况下是不会影响原来集合中的元素的,这往往也是我们期待的)
不创建流对象,每个流对象只可以使用一次
在每次使用流时,直接stream()
List<Author> authors = getAuthors();
authors.forEach(System.out::println);
authors.stream().flatMap(author -> author.getBooks().stream()).forEach(System.out::println);