如何在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
如果您只想计算,那么您可以使用simpleStream#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)
方法返回一个布尔值