通过流api解释解二进制到整数代码

Poo*_*oja 0 java java-8

在解决代码战中的kata时,我遇到了将二进制数(以列表形式)转换为整数的问题的单行解决方案.我无法理解人们使用java stream api reduce函数的解决方案.请帮我理解.

例如:[0,0,0,1]被视为0001,它是1的二进制表示.

import java.util.List;

public class BinaryArrayToNumber {

    public static int ConvertBinaryArrayToInt(List<Integer> binary) {
       return binary.stream().reduce((x, y) -> x * 2 + y).get();
 }
}
Run Code Online (Sandbox Code Playgroud)

Ryo*_*tsu 5

首先,它背后的数学基于这里描述的方法

在示例的帮助下,可以最好地理解代码的工作.考虑二进制数1011(十进制11)

  • 该操作按顺序流式传输.从方式,减少操作的行为,我们将重命名xaccumulatory作为ele
  • 我们现在可以在数学上说明上述操作

    accumulator = (accumulator*2)+ ele // 在这里指出原因

  • 让我们在1011上运行公式

  • 流式传输从第一个元素开始,即从左侧开始,然后顺序进行
  • start:accumulator = 0
  • 1)accumulator =(0*2)+ 1 //第一个元素,累加器= 1
  • 2)accumulator =(1*2)+ 0 //第二个元素,累加器= 2
  • 3)累加器=(2*2)+ 1 //第三个元素,累加器= 5
  • 4)accumulator =(5*2)+ 1 //最后一个元素,累加器= 11

您可以将其扩展为n个二进制数字.

需要注意的一件重要事情是,虽然这对于编码竞赛来说是可以的,但是这绝不应该用于现实世界的应用中,因为它reduce()需要一个关联操作并且也不能保证顺序运行