相关疑难解决方法(0)

如何以与List.hashCode()相同的方式计算流的哈希码

我刚刚意识到使用Stream.reduce(...)实现以下算法来计算流的哈希码是不可能的.问题是哈希码的初始种子1不是累加器的标识.

List.hashCode()的算法 :

int hashCode = 1;
for (E e : list)
  hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
Run Code Online (Sandbox Code Playgroud)

您可能会想到以下内容是正确的,但事实并非如此,尽管如果流处理没有拆分它会起作用.

List<Object> list = Arrays.asList(1,null, new Object(),4,5,6);
int hashCode = list.stream().map(Objects::hashCode).reduce(1, (a, b) -> 31 * a + b);
Run Code Online (Sandbox Code Playgroud)

看来,这样做的唯一明智的方法是得到IteratorStream和做正常的顺序处理或将其收集到List第一.

java hash hashcode java-stream

6
推荐指数
1
解决办法
1666
查看次数

标签 统计

hash ×1

hashcode ×1

java ×1

java-stream ×1