1. 概论
1.1 为什么学习?1.2 函数式编程思想 2. Lambda表达式3. Stream流4. Optional
1. 概论 1.1 为什么学习?大数量下处理集合效率高代码可读性高接近自然语言,易于理解易于并发编程代码简洁开发快速 1.2 函数式编程思想
不关心是哪个对象,甚至是方法名是什么,函数式编程关心数据的映射。
2. Lambda表达式Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。使用Lambda表达式可以使代码变得更加简洁。
核心原则:可推到可省略
Lambda表达式的语法如下:
(parameters) -> expression
或
(parameters) ->{ statements; }
Java中的一些没有意义的语法可以省略,函数名这些都可以省去。函数式编程只关注具体的参数列表和方法体,从下面代码就可以发现
public class LambdaTest {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("被执行");
}
}).start();
new Thread(() -> {
System.out.println("新线程被执行了");
}).start();
}
}
在idea中可以使用Alt+Enter快捷键切换Lambda表达式,也可以再次切换回来。
省略规则:
1.抽象方法中参数的类型可以省略。
2.当抽象方法的参数只有一个的时候,小括号可以省略。
3.当大括号中语句只有一条的时候,大括号,语句后面的分号和return关键字都可以省略。
下面是省略后的Lambda表达式
public class LambdaTest {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("被执行");
}
}).start();
//省略后的Lambda表达式
new Thread(() ->System.out.println("新线程被执行了")).start();
}
}
3. Stream流
什么是 Stream?
Stream(流)是一个来自数据源的元素队列并支持聚合操作。Stream流可以对集合和数组进行操作的。
对于Stream的快速入手
public class LambdaTest {
public static void main(String[] args) {
List ls = new ArrayList();
ls.add(12);
ls.add(10);
ls.add(18);
ls.add(18);
//集合转化为流
ls.stream()
//去重
.distinct()
//筛选出来大于10的
.filter(new Predicate() {
@Override
public boolean test(Integer integer) {
return integer>10;
}
})
//打印
.forEach(new Consumer() {
@Override
public void accept(Integer integer) {
System.out.println(integer);
}
});
}
}
这里可以优化为Lambda表达式
public class LambdaTest {
public static void main(String[] args) {
List ls = new ArrayList();
ls.add(12);
ls.add(10);
ls.add(18);
ls.add(18);
//集合转化为流
ls.stream()
//去重
.distinct()
//筛选出来大于10的
.filter(integer -> { return integer>10; })
//打印
.forEach(integer -> System.out.println(integer));
}
}
这里我们可以用idea的debug来查看下具体的过程,在这里打下断点,并查看具体过程。
- 去重过程
筛选过程
打印输出
在这里forEach是作为终结操作,若没有终结操作则不会生效。若用过终结操作不会再进行其他操作,会将流关闭。
常见的终结操作
void forEach(Consumer action) 对此流的每个元素执行操作
long count() 返回此流中的元素数
Optional 类的引入很好的解决空指针异常,当我们传入null值时并不会报空指针异常的错误。
public class LambdaTest {
public static void main(String[] args) {
String value = null;
// Optional.ofNullable 允许传递null 参数
Optional a = Optional.ofNullable(value);
}
}
如果使用Optional.of 且参数是 null,则会抛出异常 NullPointerException,如果非要使用Optional.of方法可以和Optional.empty()方法结合使用。通过Optional.empty()方法返回空的 Optional 实例。
Optional还有很多的方法,可以自行查看。



