我曾经使用大量的@NotNull/@Nullable
注释来使IDE能够帮助我NPE
在编译时找到潜力.但是,我的新团队不允许使用任何@NotNull/@Nullable
注释,也不允许使用自定义注释.结果,我变得更容易写出NPE
比以前造成的错误.
我尝试了几种解决方案:
Optional<T>
在java 8中使用.但是,这并不适用于所有情况.通常不建议将其Optional<T>
用作字段或参数的类型.Optional<T>
实例本身也是非常令人沮丧的null
.此外,在调用时很难在lambda表达式中操作控制流ifPresent(obj->...)
(在Java 9中更容易).并且使用太多Optional<T>
s会使代码变得有点冗长.(更新:不幸的是,Optional<T>
现在也被禁止使用)@Nullable
.这个解决方案确实可以帮助我发现一些潜在的错误,但是,IDE会建议我检查几乎每个方法调用,这真的很烦人,因为很多方法都是故意设计不返回的null
.null
通过方法调用将可能传播到任何地方.在这种情况下,方法的每个参数都是可能的null
,并且当检查参数是否为null时,该方法通常会null
连续返回.最后,每个方法都被"感染",有可能接收null
参数并返回null
.Objects.requireNonNull()
来防止上述问题.它略微减少了null
到处检查的痛苦.但是,它不保证调用者null
在null
不允许的情况下不会传递给案例.一旦null
通过,NPE
抛出的运行时更可能破坏您的应用程序.有关于在编译时检测NPE(并保存我的工作)的其他建议吗?我认为这个问题的解决方案可以被广泛使用,不仅可以帮助自己,因为并非所有团队都允许使用@NotNull/@Nullable
注释和Optional<T>
s.
我是并行编程的新手.我的任务是分析数百个数据文件.这些数据中的每一个都接近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)
然后对于每个data
在data_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)
然后去另一组.
所以问题是在计算数百个文件的整个过程中,池被重建多次.我怎样才能避免重新创建池和进程的开销?我的代码中是否有大量内存开销?有没有更好的方法让我尽可能少地花时间?
谢谢!
我正在使用自定义CompoundView
扩展LinearLayout
到显示的项目RecyclerView
。每个项目都会显示一个包含多个段落和图像的文章。
所述CompoundView
添加TextView
或ImageView
动态地基于由附加数据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
具有多个ImageView
s和TextView
s的项目,当我滚动远离它然后向后滚动时,滚动会变得非常不平滑。
我猜这是因为 …
performance android android-layout android-view android-recyclerview
我有一个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)
我不知道为什么我找不到ImageView
的findViewById(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) 我的活动在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
有没有什么方法可以只记录异常的简单名称,而无需从代码中显式检索它?
例如,通过调用
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) 在 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)
这是最好的解决方案,还是有更好的范式来解决这个问题?
我将部分代码和资源提取到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.
我在 Book Algorithms 4th 中学习 KMP 算法。我可以理解大部分算法,但已经被困在 dfa 构建过程中了几天。
以模式ABABAC
为例。当C
(dfa 的状态为 5)不匹配时,我们应该在文本中右移一个字符。所以我们知道的模式字符是BABA
. 但是,如何在构建过程中弄清楚dfa的下一个状态?我没能理解下面的文字:
例如,当我们在 j=5 处出现不匹配时,为了决定 DFA 应该做什么
ABABAC
,我们使用 DFA 来了解完整备份将使我们处于状态 3 forBABA
,因此我们可以复制dfa[][3]
到dfa[][5]
。
“完整备份将使我们处于状态 3”是什么意思BABA
,以及如何在没有指定输入的情况下得出这个结论?我无法理解留给文本的图表。谁能解释一下是什么意思?我已经尝试自己理解了几天,但仍然无法理解。谢谢!
当我单击 之外的空间时PopupWindow
,窗口将关闭。但是,如果我想在ListView
窗口外滚动,则滚动事件首先被识别为单击事件,并被窗口拦截,因此窗口被关闭,而滚动不被执行。
如何在ListView
窗口关闭的同时滚动,这样我就不需要再次滚动它。
我对反应式编程非常陌生。尽管我对函数式编程和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对其进行重构?
它是一个好主意,只需更换所有的CompletableFuture
用Mono
?