小编Rik*_*Rik的帖子

返回Java流中的第一个结果匹配谓词或所有不匹配的结果

我有一个Validator提供isValid(Thing)方法的接口,返回ValidationResult包含a boolean和原因消息的方法.

我想创建一个ValidatorAggregator这个接口的实现,它在多个Validators上执行OR (如果有的话Validator返回一个肯定的结果,那么结果是正的).如果任何验证器成功,我想短路并返回其结果.如果没有验证器成功,我想返回所有失败消息.

我可以使用流简洁地执行此操作findFirst().orElse(...)但是如果findFirst返回空,则使用此模式会丢失所有中间结果:

public ValidationResult isValid(final Thing thing) {
    return validators.stream()
      .map(v -> validator.isValid(thing))
      .filter(ValidationResult::isValid)
      .findFirst()
      .orElseGet(() -> new ValidationResult(false, "All validators failed'));
}
Run Code Online (Sandbox Code Playgroud)

有没有办法使用流捕获失败的结果,或者实际上比下面更简洁?

public ValidationResult isValid(final Thing thing) {
    final Set<ValidationResult> failedResults = new HashSet<>();
    for (Validator validator : validators) {
        final ValidationResult result = validator.isValid(thing);
        if (result.isValid()) {
            return result;
        }
        failedResults.add(result);
    }
    return new ValidationResult(false, "No successful …
Run Code Online (Sandbox Code Playgroud)

java aggregate predicate java-8 java-stream

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

在Kotlin中,如何以惯用方式访问可为空的嵌套映射值,或返回默认值?

快速Kotlin最佳实践问题,因为我无法从文档中找到最佳方法.

假设我有以下嵌套映射(为此问题的目的明确指定键入):

val userWidgetCount: Map<String, Map<String, Int>> = mapOf(
        "rikbrown" to mapOf(
                "widgetTypeA" to 1,
                "widgetTypeB" to 2))
Run Code Online (Sandbox Code Playgroud)

以下模式可以更简洁吗?

 fun getUserWidgetCount(username: String, widgetType: String): Int {
    return userWidgetCount[username]?.get(widgetType)?:0
}
Run Code Online (Sandbox Code Playgroud)

换句话说,如果用户已知并且他们有该窗口小部件类型的条目,我想返回用户窗口小部件计数,否则为零.特别是我看到我[]最初可以使用语法来访问地图,但是在使用之后我无法在第二级看到这样做的方法?..

jvm nullable non-nullable kotlin

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

为什么 ref.watch(otherProvider.stream) 在 Riverpod 2.x 中已弃用,并将在 3.x 中删除?

我正在使用 Riverpod 监听商店中所选商品的更改:

  1. 我有一个PlacesStoreStream<PlaceDetails?> watchPlace(PlaceId placeId)方法的存储库。
  2. 我把它包装在一个家庭提供者中,如下所示:
    @riverpod
    Stream<PlaceDetails?> place(PlaceRef ref, InternalPlaceId placeId) {
        final store = ref.watch(placesStoreProvider);
        return store.watchPlace(placeId);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 我有一个单独的StateProvider, selectedPlaceIdProvider,它使用用户在地图上选择的地点的地点 ID 进行更新。
  4. 我有另一个提供商,selectedPlaceProvider它将两者结合起来,如下所示:
    @riverpod
    Stream<PlaceDetails?> selectedPlace(SelectedPlaceRef ref) {
        final placeId = ref.watch(selectedPlaceIdProvider);
        if (placeId != null) {
            return ref.watch(placeProvider(placeId).stream);
        }
    
        return const Stream.empty();
     }
    
    Run Code Online (Sandbox Code Playgroud)

我这样做是因为我有许多小部件想要知道用户选择了哪个地方,所以我认为将其拉入包含当前所选地点详细信息的提供程序中是有意义的(同时仍然维护家庭提供程序)因此可以查找临时位置)。

但是,在使用时ref.watch(placeProvider(placeId).stream)我被警告说它.stream已被弃用。我不太明白我应该用什么来取代它。

上述模式有效吗?如果是这样,我应该.stream用什么替换,这样我仍然可以听到我当前选择的位置的任何更改。

dart flutter riverpod

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