如何使用java流计算掩码

如何使用java流计算掩码,java,java-stream,Java,Java Stream,我有这个密码。这里的地图是map 你可以试试这个,但正如Aniket在上面所说的,使用Strem不是一个好主意 map.entrySet().filter( entry -> entry.getKey().getValue() > 0 && entry.getValue()).forEach(k->{mask=mask | (1 << (k.getKey().getValue() - 1))}); map.entrySet().filter(ent

我有这个密码。这里的地图是
map


你可以试试这个,但正如Aniket在上面所说的,使用Strem不是一个好主意

map.entrySet().filter( entry -> entry.getKey().getValue() > 0 && entry.getValue()).forEach(k->{mask=mask | (1 << (k.getKey().getValue() - 1))});

map.entrySet().filter(entry->entry.getKey().getValue()>0&&entry.getValue()).forEach(k->{mask=mask |)(1您可以将条目映射到计算值,然后在reduce操作符中应用

map.entrySet().stream()
       .filter(entry -> entry.getValue() && entry.getKey().getValue() > 0)
       .mapToInt(entry -> (1 << (entry.getKey().getValue() - 1)))
       .reduce(0, (r, i) -> r | i)
map.entrySet().stream()
.filter(entry->entry.getValue()&&entry.getKey().getValue()>0)
.mapToInt(条目->(1 r | i)
编辑:将0作为标识元素添加到reduce操作中,如果映射为空,则默认值为0

Edit2:正如评论中所建议的,我颠倒了过滤器顺序,以避免不必要的方法调用

编辑3:正如注释中所建议的那样,现在使用的是mapToInt

,类似于,但此处以其他方式编写了reduce,表示它应该从0开始

map.entrySet().stream()
    .filter(entry -> entry.getKey().getValue() > 0 && entry.getValue())
    .map(entry -> (1 << (entry.getKey().getValue() - 1)))
    .reduce(0, (a, v) -> a | v);
map.entrySet().stream()
.filter(entry->entry.getKey().getValue()>0&&entry.getValue())
.地图(条目->(1 a | v);
由于它是在注释中维护的,您可以通过以下方式对其进行进一步分解:

map.entrySet().stream()
    .filter(Map.Entry::getValue)
    .map(entry -> entry.getKey().getValue())
    .filter(keyValue -> keyValue > 0)
    .map(keyValue -> (1 << (keyValue - 1)))
    .reduce(0, (a, v) -> a | v);
map.entrySet().stream()
.filter(Map.Entry::getValue)
.map(entry->entry.getKey().getValue())
.filter(keyValue->keyValue>0)
.地图(键值->(1 a | v);

这里是另一种选择

int mask = map.entrySet().stream().filter(Entry::getValue)
            .mapToInt(e -> e.getKey().getValue()).filter(a -> a > 0)
            .reduce(0, (a, b) -> a | (1<<(b-1)));
int mask=map.entrySet().stream().filter(Entry::getValue)
.mapToInt(e->e.getKey().getValue()).filter(a->a>0)

.reduce(0,(a,b)->a |(1为上述代码编写函数,因为
mask
正在变异,可能看起来很难看。你最好使用命令式代码IMO。@AniketSahrawat你能解释一下吗?我不明白你的意思。你认为我当前的解决方案可以吗?
map.entrySet().filter(entry->entry.getKey().getValue())>0&&entry.getValue()).forEach(k->{mask=mask|(1@Daemon这将发出一个编译器错误:
mask
必须是final或有效final。它是compile吗?mask在外部并且应该是final。很好的解决方案。这很简单,但我会将筛选器反转为首先检查布尔值。然后,除非布尔值为true,否则您可以避免双重方法查找。请注意
mapToInt
的存在。与另一个答案一样,它将受益于使用
mapToInt
,尤其是第二个变量,因为大多数操作都可以在没有装箱开销的情况下完成。
map.entrySet().stream()
    .filter(Map.Entry::getValue)
    .map(entry -> entry.getKey().getValue())
    .filter(keyValue -> keyValue > 0)
    .map(keyValue -> (1 << (keyValue - 1)))
    .reduce(0, (a, v) -> a | v);
int mask = map.entrySet().stream().filter(Entry::getValue)
            .mapToInt(e -> e.getKey().getValue()).filter(a -> a > 0)
            .reduce(0, (a, b) -> a | (1<<(b-1)));