【问题标题】:How to convert a string to a boolean[] array using Java 8 streams?如何使用 Java 8 流将字符串转换为布尔 [] 数组?
【发布时间】:2017-08-01 22:47:21
【问题描述】:

* 字符转换为 true,其他所有字符都转换为 false。

这个答案显示了如何转换为布尔[],但我试图转换为一个标量布尔数组。

java8 lambda: convert a String of 0's and 1's to basic array of booleans

【问题讨论】:

  • 你想使用 lambdas 吗?
  • 这实际上是非常困难的。我能想到的最佳解决方案是collectingAndThen(toList(), boxedBooleanListToArray) 之类的。
  • @travisjayday 是的
  • 当然:没有比转换为Boolean[]List<Boolean>,然后将其转换为原始boolean[] 更好的方法了,您必须编写该部分自己(或从第三方库获取)。
  • 转换为boolean原始类型的数组是一种资源浪费。最好使用BitSet。您是否因任何特殊原因需要boolean[]

标签: java functional-programming java-8


【解决方案1】:

如果要求只是转换为所描述的布尔数组并使用流,您可以这样做:

boolean[] result = new boolean[string.length()];
IntStream.range(0, string.length()).forEach(n -> result[n] = (string.charAt(n)=='*'));

【讨论】:

    【解决方案2】:

    考虑改用BitSet,这是更高效的存储结构

    BitSet bs = IntStream.range(0, string.length())
                         .filter(i -> string.charAt(i)=='*')
                         .collect(BitSet::new, BitSet::set, BitSet::or);
    

    您可以使用bs.get(index) 测试这些位,它并不比array[index] 差。

    请注意,BitSet 也有一个stream() 方法,该方法生成true 值的索引的IntStream,相当于我们用于构造BitSet 的流。因此,如果您在某些时候无法摆脱没有数组,您可以像这样创建它

    boolean[] array = new boolean[string.length()];
    bs.stream().forEach(i -> array[i]=true);
    

    【讨论】:

    • Holger,我对这个问题的反应非常慢(实际上我正在休息),但我确实想到了这一点。
    猜你喜欢
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2018-12-02
    • 1970-01-01
    • 2021-12-23
    相关资源
    最近更新 更多