Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.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
如何在Java中使用lambda过滤布尔数组_Java_Arrays_Regex_Java 8_Java Stream - Fatal编程技术网

如何在Java中使用lambda过滤布尔数组

如何在Java中使用lambda过滤布尔数组,java,arrays,regex,java-8,java-stream,Java,Arrays,Regex,Java 8,Java Stream,我想用“| |”分割一个字符串,并计算一个函数布尔值有效(string[]r)的结果数组返回true的元素数 我尝试使用Arrays.stream来计算和过滤数组,最后,过滤得到的数组以只保留真值 boolean[] truthSet = Arrays.stream(range.split("\\s+)) .map(r -> isValid(r)) .filter(b -> _

我想用
“| |”
分割一个字符串,并计算一个函数
布尔值有效(string[]r)
的结果数组返回
true
的元素数

我尝试使用
Arrays.stream
来计算和过滤数组,最后,过滤得到的数组以只保留真值

boolean[] truthSet = Arrays.stream(range.split("\\s+))
                           .map(r -> isValid(r))
                           .filter(b -> _whatGoesHere_)
                           .toArray(boolean[]::new);

我试着用
b
b==true
来代替
\u whatgoesher
,但没有用。实现这一点的正确方法是什么?

您可以简单地传递它自己,lambda看起来像
b->b
(因为它已经是一个布尔值:

 Boolean[] truthSet = Arrays.stream(range.split("\\s+"))
                       .map(r -> isValid(r))
                       .filter(b -> b)
                       .toArray(Boolean[]::new);
但您只获取值,即
true
并将它们打包到数组中-这将生成一个布尔数组,其中只有
true
值。您的意思可能是:

 String[] validStrings = Arrays.stream(range.split("\\s+"))
                       .filter(r -> isValid(r))
                       .toArray(String[]::new);

注意:要计算值,您可以使用
Stream#count

如果您只想计算,那么您可以使用simple
Stream#count

long count = Arrays.stream(range.split("\\s+"))
                       .map(r -> isValid(r))
                       .filter(b -> b)
                       .count();
由于没有像
IntStream、DoubleStream等BooleanSteram,因此无法将
流转换为布尔[]
,在这种情况下,必须使用
布尔[]

Boolean[] truthSet = Arrays.stream(range.split("\\s+"))
                           .map(r -> isValid(r))
                           .filter(b -> b)
                           .toArray(Boolean[]::new); 

我希望这就是你想要的

   Boolean[] truthSet = Arrays.stream(range.split("\\s+"))
            .filter(r -> isValid(r))
            .map(s -> Boolean.TRUE)
            .toArray(Boolean[]::new);

如果我正确地阅读了问题,OP要求按“| |”分割,并且正在查找计数,因此(最小)可行的解决方案如下所示:

import java.util.regex.Pattern;
课堂擦伤{
公共静态void main(字符串[]args){
字符串测试=“|a | a | b | a | bn”;
长计数=模式。编译(“\\\\\\\\\”)
.splitAsStream(测试)
.filter(Scratch::isValid)
.count();
系统输出打印项次(计数);
}
私有静态布尔值isValid(字符串r){
返回“a”。等于(r);
}
}

“没有用”-为什么?结果是什么?@SharonBenAsher好吧,我可能过早地假设,但我的IDE认为它是“lambda表达式中的错误返回类型。对象无法转换为布尔值”。错误不是由
b->b
引起的。你应该阅读它。然后发布它。它与尝试生成
布尔值的数组有关(基本类型)来自
(对象)。无论如何,创建只有真值的数组有什么意义?流的大小不会传递相同的信息吗?(即有N个有效字符串)?无需
映射元素;您可以直接使用
过滤器
数组。流(…)。过滤器(str->isValid)(str)).count()
。第一部分根本不能回答这个问题。
.toArray(boolean[]::new);
不起作用,因为此时的类型是
。您可以使用
布尔
而不是基元类型…它将返回一个包含所有“true”的数组-那有什么区别呢?是的,我想把它转换成布尔数组,但这也行得通。我最终想计算返回isValid的
true
的项数,这也行得通。不过,我很好奇,如果我真的想要布尔数组,我该怎么做?@Gothamcityriss,来计算你不需要的项数收集到数组,您可以使用
Stream.count()
collector.counting()
方法。您需要编辑问题,并说明
过滤器(b->b)
将编译的确切要求是什么?是的,它将编译并运行良好。我相信您的
方法是有效的(r)
方法返回一个
布尔值