文章

java8测试、调试和重构

java8测试、调试和重构1.Lambda化2.进进出出,摇摇晃晃3.孤独的覆盖4.同样的事情做两次5.使用forEach不如使用peak6.断点调试7.总结1.Lambda化使用Lambda表达式重构现有代码就是Lambda化。2.进进出出,摇摇晃晃如果一段代码不断的查询和操作某对象,目的只是在最后给该对象设个值,那么这段代码就本该属于操作的对象。3.孤独的覆盖使用集成,目的只是为了...

java8测试、调试和重构

文章信息

  • 原文链接: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重构代码,我认为一个重要的地方就是:
不在小的层面思考。要分析被重构的代码的原始状态,目标状态,以及什么操作。不要在细节地方考虑怎么重构方法,怎么抽取状态。而是分析需要什么操作,进行何种数据的变换,如何归一结论。

本文由作者按照 CC BY 4.0 进行授权