【发布时间】:2016-04-26 07:07:31
【问题描述】:
我试图将字符串流映射到这些字符串的哈希值,同时将字符串保留在输出中。我最终将散列转换为字符串,以便我可以映射到String[],甚至可以将它们作为一个字符串连接在一起。我希望在 lambda 的输出中可以同时使用 String 和 byte[] 避免一次转换。如果没有定义一个特定的值对象来保存这两个,是否有一种互惠的BiConsumer 即 BiProducer?
public static final ArrayList<String> inputs; // ... initialized elsewhere
...
inputs.parallelStream().map(s -> {
try {
String h = String.format("%032x",
new BigIntger(1, MessageDigest.getInstance("MD5")
.digest(s.getBytes(StandardCharsets.UTF_8))));
String[] r = {s, h};
return r;
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}).foreach(tuple -> {String input = tuple[0], hash = tuple[1]; ...});
你看,如果在foreach 中我想要一个byte[] 的哈希值,我会希望传递我在map 中已经拥有的内容,否则我会在字符串之间转换只是为了能够方便地通过。显然,如果我创建一个类来容纳这两种类型,那将是一个费力的解决方案;是否没有预先存在的用于将步骤映射到下游的多个值的可供性?
【问题讨论】:
-
您的问题自相矛盾。
BiConsumer消耗 两个项目而不产生任何东西。相反,假设的BiSupplier,将在不消耗任何东西的情况下产生两个项目,这对于期望Function的map操作是不合适的,它消耗一个项目并产生一个项目,因此与Function相反又是Function。其他任何东西都是无用的,因为map需要Function参数,因此您必须提供Function参数而不进行任何讨论...... -
用当前的技术水平将两个值装箱到另一个对象中是不可避免的,但如果您正在寻找一种更愉快的编码方式,您可以尝试StreamEx。
标签: java tuples java-stream