java8测试、调试和重构
java8测试、调试和重构1.Lambda化2.进进出出,摇摇晃晃3.孤独的覆盖4.同样的事情做两次5.使用forEach不如使用peak6.断点调试7.总结1.Lambda化使用Lambda表达式重构现有代码就是Lambda化。2.进进出出,摇摇晃晃如果一段代码不断的查询和操作某对象,目的只是在最后给该对象设个值,那么这段代码就本该属于操作的对象。3.孤独的覆盖使用集成,目的只是为了...
文章信息
- 原文链接:https://jiayq.blog.csdn.net/article/details/89406894
- 发布时间:2019-04-19 19:42:00
- 阅读量:510
- 分类:java同时被 2 个专栏收录, 订阅专栏, Java8
- 标签:#java8重构, #Lambda化, #Lambda表达式如何调试, #如何写出好的Lambda表达式
摘要
文章浏览阅读510次。java8测试、调试和重构1.Lambda化2.进进出出,摇摇晃晃3.孤独的覆盖4.同样的事情做两次5.使用forEach不如使用peak6.断点调试7.总结1.Lambda化使用Lambda表达式重构现有代码就是Lambda化。2.进进出出,摇摇晃晃如果一段代码不断的查询和操作某对象,目的只是在最后给该对象设个值,那么这段代码就本该属于操作的对象。3.孤独的覆盖使用集成,目的只是为了…
java8测试、调试和重构
- 1.Lambda化
- 2.进进出出,摇摇晃晃
- 3.孤独的覆盖
- 4.同样的事情做两次
- 5.使用forEach不如使用peak
- 6.断点调试
- 7.总结
1.Lambda化
使用Lambda表达式重构现有代码就是Lambda化。
2.进进出出,摇摇晃晃
如果一段代码不断的查询和操作某对象,目的只是在最后给该对象设个值,那么这段代码就本该属于操作的对象。
3.孤独的覆盖
使用集成,目的只是为了覆盖一个方法,那么,就可以用Lambda表达式替换这个方法。
比如内部类,如果内部类实现的接口只有一个,那么,这个内部类就可以Lambda化。
4.同样的事情做两次
有些方法如果使用复用的方法会增加系统的耦合度,此时,重复写同样的方法可以立即降低系统的耦合度。
当两个方法大体上差不多,只有行为不同时,可以尝试Lambda化。
5.使用forEach不如使用peak
forEach的源码:
1
2
3
4
@Override
public void forEach(Consumer<? super P_OUT> action) {
evaluate(ForEachOps.makeRef(action, false));
}
peak的源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Override
public final Stream<P_OUT> peek(Consumer<? super P_OUT> action) {
Objects.requireNonNull(action);
return new StatelessOp<P_OUT, P_OUT>(this, StreamShape.REFERENCE,
0) {
@Override
Sink<P_OUT> opWrapSink(int flags, Sink<P_OUT> sink) {
return new Sink.ChainedReference<P_OUT, P_OUT>(sink) {
@Override
public void accept(P_OUT u) {
action.accept(u);
downstream.accept(u);
}
};
}
};
}
可以很明显的看到,forEach是一个求值的过程,是一个终结的操作,这样就无法继续操作流了。
而peak方法返回值依然是一个流,仍然可以继续操作。
所以能够使用forEach的地方如果后续还需要对流进行操作,那么就使用peak吧
6.断点调试
Lambda表达式执行的每一步都交给了类库,所以实际上很难调试每一步Lambda表达式具体执行了什么操作。但是如果你非要纠结与单步调试的话,不放试试在peak方法里面设置断点。
7.总结
如何使用Lambda重构代码,我认为一个重要的地方就是:
不在小的层面思考。要分析被重构的代码的原始状态,目标状态,以及什么操作。不要在细节地方考虑怎么重构方法,怎么抽取状态。而是分析需要什么操作,进行何种数据的变换,如何归一结论。