小编Pro*_*tle的帖子

Java - 在不允许使用@NotNull或@Nullable注释时在编译时检测NPE的最佳方法

我曾经使用大量的@NotNull/@Nullable注释来使IDE能够帮助我NPE在编译时找到潜力.但是,我的新团队不允许使用任何@NotNull/@Nullable注释,也不允许使用自定义注释.结果,我变得更容易写出NPE比以前造成的错误.

我尝试了几种解决方案:

  1. Optional<T>在java 8中使用.但是,这并不适用于所有情况.通常不建议将其Optional<T>用作字段或参数的类型.Optional<T>实例本身也是非常令人沮丧的null.此外,在调用时很难在lambda表达式中操作控制流ifPresent(obj->...)(在Java 9中更容易).并且使用太多Optional<T>s会使代码变得有点冗长.(更新:不幸的是,Optional<T>现在也被禁止使用)
  2. 让IDE将每个未注释的实例视为@Nullable.这个解决方案确实可以帮助我发现一些潜在的错误,但是,IDE会建议我检查几乎每个方法调用,这真的很烦人,因为很多方法都是故意设计不返回的null.
  3. 检查每个方法调用.这是一个可行的解决方案,但是它具有严重的影响,即null通过方法调用将可能传播到任何地方.在这种情况下,方法的每个参数都是可能的null,并且当检查参数是否为null时,该方法通常会null连续返回.最后,每个方法都被"感染",有可能接收null参数并返回null.
  4. 打电话Objects.requireNonNull()来防止上述问题.它略微减少了null到处检查的痛苦.但是,它不保证调用者nullnull不允许的情况下不会传递给案例.一旦null通过,NPE抛出的运行时更可能破坏您的应用程序.
  5. 切换到kotlin.当然,不允许:)

有关于在编译时检测NPE(并保存我的工作)的其他建议吗?我认为这个问题的解决方案可以被广泛使用,不仅可以帮助自己,因为并非所有团队都允许使用@NotNull/@Nullable注释和Optional<T>s.

java null nullpointerexception

16
推荐指数
2
解决办法
1416
查看次数

如何在Python 3中重用流程池进行并行编程

我是并行编程的新手.我的任务是分析数百个数据文件.这些数据中的每一个都接近300MB,并且可以切成多个切片.我的电脑是一台4芯电脑.我希望尽快得到每个数据的结果.
每个数据文件的分析包括2个程序.首先,将数据读入内存,然后将其切片为切片,这是密集型工作.然后,对此文件的切片进行大量计算,这是cpu密集型的.
所以我的策略是将这些文件分组为4组.对于这些文件的每一组,首先,将4个文件的所有数据读入内存,4个进程中有4个进程.代码就像,

with Pool(processes=4) as pool:
    data_list = pool.map(read_and_slice, files)  # len(files)==4
Run Code Online (Sandbox Code Playgroud)

然后对于每个datadata_list,做4个过程的计算工作.

for data in data_list:  # I want to get the result of each data asap
    with Pool(processes=4) as pool:
        result_list = pool.map(compute, data.slices)  # anaylyze each slice of data
    analyze(result_list)  # analyze the results of previous procedure, for example, get the average.
Run Code Online (Sandbox Code Playgroud)

然后去另一组.
所以问题是在计算数百个文件的整个过程中,池被重建多次.我怎样才能避免重新创建池和进程的开销?我的代码中是否有大量内存开销?有没有更好的方法让我尽可能少地花时间?

谢谢!

python parallel-processing process multiprocessing

7
推荐指数
1
解决办法
2832
查看次数

Android-在RecyclerView中重新创建自定义动态生成的复合视图,导致性能不佳

我正在使用自定义CompoundView扩展LinearLayout到显示的项目RecyclerView。每个项目都会显示一个包含多个段落和图像的文章。

所述CompoundView添加TextViewImageView动态地基于由附加数据CompoundView.setData(List<DataPiece> pieces),附接数据之前其数量是未知的。

每个DataPiece对象都告诉CompoundView它是文本还是图像。这是以下代码CompoundView.setData(List<DataPiece> pieces)

public void setData(List<DataPiece> pieces) {
    removeAllViews();
    for (DataPiece dataPiece : pieces) {
        switch (dataPiece.getType()) {
            case IMAGE:
                ImageView imageView = new ImageView(getContext());
                ...
                addView(imageView);
                break;
            case TEXT:
                TextView textView = new TextView(getContext());
                ...
                addView(textView);
                break;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在中RecyclerView.Adapter.onBindViewHolder(),数据CompoundView通过调用附加到MyViewHolder.compoundView.setData(...)RecyclerView创建时,它工作正常。

但是,对于CompoundView具有多个ImageViews和TextViews的项目,当我滚动远离它然后向后滚动时,滚动会变得非常不平滑。

我猜这是因为 …

performance android android-layout android-view android-recyclerview

5
推荐指数
1
解决办法
3474
查看次数

为什么findViewById()为抽屉头中的视图返回null?

我有一个DrawerLayout包含NavigationView标题布局的a.XML如下:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
                                        xmlns:app="http://schemas.android.com/apk/res-auto"
                                        android:id="@+id/drawer_layout"
                                        android:layout_width="match_parent"
                                        android:layout_height="match_parent">

    <android.support.design.widget.NavigationView
            android:id="@+id/navigation_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            app:headerLayout="@layout/drawer_header"
            app:menu="@menu/drawer"/>

</android.support.v4.widget.DrawerLayout>
Run Code Online (Sandbox Code Playgroud)

headerLayout是一个LinearLayout包装ImageView,下面是drawer_header.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:background="@color/blue_primary"
    android:padding="10dp"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:layout_width="120dp"
        android:id="@+id/ivDrawerUserFace"
        android:layout_height="120dp" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

我不知道为什么我找不到ImageViewfindViewById(R.id.ivDrawerUserFace),它返回null来代替.但是,我可以通过以下代码找到它:

ViewGroup headerView = (ViewGroup) mNavigationView.getHeaderView(0);
ImageView faceView = (ImageView) headerView.getChildAt(0); // faceView is not null
String faceUrl = QingUApp.getInstance().getFaceUrl();
if (faceUrl != null) {
     Glide.with(this).load(faceUrl).into(faceView);
}
View viewById = findViewById(R.id.ivDrawerUserFace); // viewById …
Run Code Online (Sandbox Code Playgroud)

android android-layout android-view

5
推荐指数
2
解决办法
2497
查看次数

如何在CoordinatorLayout中滚动滚动顶部和底部工具栏(或任何其他视图)进入/退出屏幕?

我的活动在CoordinatorLayout中包含2个AppBarLayouts,一个在屏幕顶部,另一个在底部.我想让两个AppBarLayouts隐藏在RecyclerView的滚动上.

当只有顶部的时候,通过添加app:layout_scrollFlags="scroll|enterAlways"到工具栏和app:layout_behavior="@string/appbar_scrolling_view_behavior"RecyclerView的容器,可以很容易地将其隐藏在滚动状态.

当只有底部的AppBarLayout隐藏在滚动上时,它是通过制作自定义行为来实现的BottomAppBarLayoutBehavior extends AppBarLayout.Behavior.

但是,当它们都在滚动时隐藏时,它们会成功隐藏但RecyclerView会在滚动时抖动.顶部工具栏的区域在隐藏后留下空白空间.下面是xml:

<android.support.design.widget.CoordinatorLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.v7.widget.Toolbar
            android:id="@+id/topToolbar"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            app:layout_scrollFlags="scroll|enterAlways" />

    </android.support.design.widget.AppBarLayout>

    <FrameLayout
        android:layout_width="fill_parent"
        android:orientation="vertical"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        android:id="@+id/RecyclerViewContainer"
        android:layout_height="fill_parent"/>

    <android.support.design.widget.AppBarLayout 
        android:layout_width="match_parent"
        android:layout_gravity="bottom"
        app:layout_behavior="myPackage.BottomAppBarLayoutBehavior">

        <LinearLayout
            android:layout_width="match_parent"
            android:orientation="horizontal"
            android:layout_height="match_parent">
            <!-- some Views -->
        </LinearLayout>

    </android.support.design.widget.AppBarLayout>

</android.support.design.widget.CoordinatorLayout>
Run Code Online (Sandbox Code Playgroud)

以下是BottomAppBarLayoutBehavior的代码:

public class BottomAppBarLayoutBehavior extends AppBarLayout.Behavior {
    private static final Interpolator INTERPOLATOR = new FastOutSlowInInterpolator();
    private boolean mIsAnimatingOut = false;

    public BottomAppBarLayoutBehavior(Context context, AttributeSet attrs) {
        super();
    }

    @Override
    public boolean onStartNestedScroll(final …
Run Code Online (Sandbox Code Playgroud)

android android-animation android-layout material-design android-toolbar

4
推荐指数
1
解决办法
3688
查看次数

Logback - 如何单独记录异常的简单名称

有没有什么方法可以只记录异常的简单名称,而无需从代码中显式检索它?

例如,通过调用

log.error(exception);
Run Code Online (Sandbox Code Playgroud)

使用 logback 模式

%d{yyyy-MM-dd}|%-5level|%m%n
Run Code Online (Sandbox Code Playgroud)

而不是仅仅记录异常堆栈跟踪

2018-01-01|ERROR|
mainPackage.foo.bar.RocketExplosionException: Houston we have a problem
  at mainPackage.foo.bar.TestThrower.fire(TestThrower.java:22)
  at mainPackage.foo.bar.TestThrower.readyToLaunch(TestThrower.java:17)
  at mainPackage.ExceptionLauncher.main(ExceptionLauncher.java:38)
Run Code Online (Sandbox Code Playgroud)

预计将记录一个包含异常简单名称的单独列

2018-01-01|ERROR|RocketExplosionException|
mainPackage.foo.bar.RocketExplosionException: Houston we have a problem
  at mainPackage.foo.bar.TestThrower.fire(TestThrower.java:22)
  at mainPackage.foo.bar.TestThrower.readyToLaunch(TestThrower.java:17)
  at mainPackage.ExceptionLauncher.main(ExceptionLauncher.java:38)
Run Code Online (Sandbox Code Playgroud)

java logging spring logback slf4j

4
推荐指数
1
解决办法
5304
查看次数

在 Reactor 3 中将 Flux 拆分为多个 Flux 的最有效方法

在 Reactor 3 中,通过模式匹配将异构通量拆分为多个通量的最有效方法是什么?(而且对每个通量的后续操作可能会大不相同)

例如,

Source Flux: a->b->c->a->b->c
 ||
 vv
A Flux: a->a->a
B Flux: b->b->b
C Flux: c->c->c
Run Code Online (Sandbox Code Playgroud)

我是反应式编程的新手,我想出的唯一解决方案是share()+ filter(),比如

val shared = flux.share();
shared.filter(x -> x.tag=='a').subscribe(a -> consumeA(a));
shared.filter(x -> x.tag=='b').subscribe(b -> consumeB(b));
shared.filter(x -> x.tag=='c').subscribe(c -> consumeC(c));
Run Code Online (Sandbox Code Playgroud)

这是最好的解决方案,还是有更好的范式来解决这个问题?

reactive-programming project-reactor

4
推荐指数
1
解决办法
3573
查看次数

如何在Intellij IDEA 14中将外部模块添加到gradle项目中?

我将部分代码和资源提取到Intellij IDEA 14中的新本地模块中,因为它们的副本已在多个项目中使用。我想将该模块用作gradle项目的支持模块。

当项目不是基于gradle时,可以通过在“项目结构”中添加依赖项轻松地将模块添加到我的项目中。但这在gradle项目中不起作用。

如何在gradle项目中使用本地模块中的代码和资源?

我应该为支持模块和gradle项目做什么?我已经阅读了gradle的用户指南,但仍然找不到解决方案。

更新:以下是项目结构

External Gradle project
--external_project
----lib
--------src
--------build.gradle
----settings.gradle

Current Gradle project    
--current_project
----app
--------src
--------build.gradle
----settings.gradle
Run Code Online (Sandbox Code Playgroud)

构建gradle时出现错误消息, Error:Configuration with name 'default' not found.

android module intellij-idea gradle android-studio

3
推荐指数
1
解决办法
1419
查看次数

如何理解KMP算法中DFA构建的过程

我在 Book Algorithms 4th 中学习 KMP 算法。我可以理解大部分算法,但已经被困在 dfa 构建过程中了几天。

以模式ABABAC为例。当C(dfa 的状态为 5)不匹配时,我们应该在文本中右移一个字符。所以我们知道的模式字符是BABA. 但是,如何在构建过程中弄清楚dfa的下一个状态?我没能理解下面的文字:

例如,当我们在 j=5 处出现不匹配时,为了决定 DFA 应该做什么ABABAC,我们使用 DFA 来了解完整备份将使我们处于状态 3 for BABA,因此我们可以复制dfa[][3]dfa[][5]

“完整备份将使我们处于状态 3”是什么意思BABA,以及如何在没有指定输入的情况下得出这个结论?我无法理解留给文本的图表。谁能解释一下是什么意思?我已经尝试自己理解了几天,但仍然无法理解。谢谢!

你可以在这里阅读算法 4 的部分。

dfa建设

algorithm substring automaton

2
推荐指数
1
解决办法
895
查看次数

如何防止滚动事件被PopupWindow拦截

当我单击 之外的空间时PopupWindow,窗口将关闭。但是,如果我想在ListView窗口外滚动,则滚动事件首先被识别为单击事件,并被窗口拦截,因此窗口被关闭,而滚动不被执行。

如何在ListView 窗口关闭的同时滚动,这样我就不需要再次滚动它。

android onclick android-popupwindow

1
推荐指数
1
解决办法
819
查看次数

如何使用反应式编程实现嵌套的异步代码?

我对反应式编程非常陌生。尽管我对函数式编程和Kotlin协程非常熟悉,但是我仍然无法弄清楚如何使用反应式编程范例来重构普通的嵌套CRUD代码,尤其是那些具有嵌套异步操作的代码。

例如,以下是基于Java 8的简单异步CRUD代码段 CompletableFuture


        getFooAsync(id)
                .thenAccept(foo -> {
                    if (foo == null) {
                        insertFooAsync(id, new Foo());
                    } else {
                        getBarAsync(foo.bar)
                                .thenAccept(bar -> {
                                   updateBarAsync(foo, bar);
                                });
                    }
                });

Run Code Online (Sandbox Code Playgroud)

使用Kotlin协程进行重构非常容易,这使得它在不失去异步性的情况下更具可读性。

 val foo = suspendGetFoo(id)
 if(foo==null) {
   suspendInsertFoo(id, Foo())
 } else {
   val bar = suspendGetBar(foo.bar)
   suspendUpdateBar(foo, bar);-
}
Run Code Online (Sandbox Code Playgroud)

但是,这样的代码是否适合于反应式编程?

如果是这样,给定一个Flux<String> idFlux,如何使用Reactor 3对其进行重构?

它是一个好主意,只需更换所有的CompletableFutureMono

java asynchronous reactive-programming project-reactor

1
推荐指数
1
解决办法
160
查看次数