Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java8映射流_Java_Java 8_Java Stream - Fatal编程技术网

Java8映射流

Java8映射流,java,java-8,java-stream,Java,Java 8,Java Stream,有没有办法让这段代码使用Java8 public static boolean areBooleansValid(Map<String, Object> pairs, List<String> errors, String... values) { for (String value : values) { if (pairs.get(value) == null) { return false; } els

有没有办法让这段代码使用Java8

public static boolean areBooleansValid(Map<String, Object> pairs, List<String> errors, String... values) {
    for (String value : values) {
        if (pairs.get(value) == null) {
            return false;
        } else if (!(pairs.get(value) instanceof Boolean)) {
            errors.add(value + " does not contain a valid boolean value");
            return false;
        }
    }
    return true;
}
public静态布尔值areBooleansValid(映射对、列表错误、字符串…值){
for(字符串值:值){
if(pairs.get(value)==null){
返回false;
}else if(!(pairs.get(value)instanceof Boolean)){
错误。添加(值+“不包含有效的布尔值”);
返回false;
}
}
返回true;
}
我是这样想的:

Stream<Object> e = Stream.of(values).map(pairs::get);
streame=Stream.of(values).map(pairs::get);

但是如何让它从该流返回不同的布尔值?

如果您只想过滤掉
对中存在的布尔值,可以应用过滤函数:

Stream.of(values).filter(value ->  pairs.get(value) != null && pairs.get(value) instanceof Boolean)
或者,如果要实际返回
true
false
值,可以使用map:

return Stream.of(values).allMatch(value -> {
            if (pairs.get(value) == null) {
                return false;
            }
            if ((pairs.get(value) instanceof Boolean)) {
                return true;
            }
            errors.add(value + " does not contain a valid boolean value");
            return false;
        });

我想你只需要:

return Arrays.stream(values)
       .allMatch(value -> pairs.get(value) instanceof Boolean);

注释

  • 我看不出你的方法有任何错误的原因
  • 也如注释
    pairs.get(value)instanceof Boolean中提到的
    pairs.get(value)!=null
    因此不需要使用
    对。获取(值)!=空
列出错误=流(值)
.filter(value->value==null | |!(pairs.get(value)instanceof Boolean))
.collect(Collectors.toList());
List errorMsg=errors.stream().filter(对象::非空)
.map(值->“”+pairs.get(值)+“不包含有效的布尔值”)
.collect(Collectors.toList());
errors.addAll(errorMsg);
返回错误。isEmpty();

您可以使用

public static boolean areBooleansValid(Map<String, Object> pairs,
                                       List<String> errors, String... values) {
    Optional<String> opt = Arrays.stream(values)
        .filter(s -> !(pairs.get(s) instanceof Boolean))
        .findFirst();
    opt .filter(s -> pairs.get(s) != null)
        .ifPresent(value -> errors.add(value+" does not contain a valid boolean value"));
    return !opt.isPresent();
}
public静态布尔值areBooleansValid(映射对,
列出错误、字符串…值){
可选opt=Arrays.stream(值)
.filter(s->!(pairs.get(s)instanceof Boolean))
.findFirst();
opt.filter->pairs.get!=null)
.ifPresent(value->errors.add(value+“不包含有效的布尔值”);
return!opt.isPresent();
}

与原始代码一样,它只搜索第一个不是
布尔值的项(可能是
null
),但仅当值不是
null时才会添加错误,因为除了获取此布尔值之外,还填充了
错误,我建议您不要这样做。另一方面,您可以尝试在循环中重用
pairs.get(value)
的结果,这样您只需要调用一次。另一方面注意:我会在方法之外添加错误消息,即
if(!areBooleansValid(…){errors.add(…);}
。目前,您的方法/功能做得太多。将两者分开应该可以使将实际逻辑转换为流非常容易。需要错误才能将消息返回给用户。如果进入第一个If语句->不告诉用户,第二个If语句->告诉用户user@maloney在Java中,你可以只返回一个参数,而不是两个,那么你能解释一下你想如何使用这个方法吗?这样我就可以给你另一个想法了?我建议你加上几个词来解释你做了什么以及为什么要这样做。还请注意,您的应用程序可能会导致
ConcurrentModificationException
(或类似情况),因为它实际上是
errors.forEach(errors.add(…)
)。此外,如果有多个错误,您将多次生成同一消息。@maloney,如果您希望进行错误聚合,Java8方法看起来与您已有的方法非常相似。curlyBraces这似乎从未在value->@maloney之后输入代码块,我已修改了答案。
public static boolean areBooleansValid(Map<String, Object> pairs,
                                       List<String> errors, String... values) {
    Optional<String> opt = Arrays.stream(values)
        .filter(s -> !(pairs.get(s) instanceof Boolean))
        .findFirst();
    opt .filter(s -> pairs.get(s) != null)
        .ifPresent(value -> errors.add(value+" does not contain a valid boolean value"));
    return !opt.isPresent();
}