【问题标题】:Is there a reverse of BiConsumer for mapping to multiple values like tuples是否有 BiConsumer 的反向映射到多个值,如元组
【发布时间】:2016-04-26 07:07:31
【问题描述】:

我试图将字符串流映射到这些字符串的哈希值,同时将字符串保留在输出中。我最终将散列转换为字符串,以便我可以映射到String[],甚至可以将它们作为一个字符串连接在一起。我希望在 lambda 的输出中可以同时使用 Stringbyte[] 避免一次转换。如果没有定义一个特定的值对象来保存这两个,是否有一种互惠的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,将在不消耗任何东西的情况下产生两个项目,这对于期望Functionmap 操作是不合适的,它消耗一个项目并产生一个项目,因此与Function 相反又是Function。其他任何东西都是无用的,因为 map 需要 Function 参数,因此您必须提供 Function 参数而不进行任何讨论......
  • 用当前的技术水平将两个值装箱到另一个对象中是不可避免的,但如果您正在寻找一种更愉快的编码方式,您可以尝试StreamEx

标签: java tuples java-stream


【解决方案1】:

除了对BiConsumer 的困惑之外,感谢您在 cmets 中建议StreamEx。看起来它有一个很好的方式来写这个:

StreamEx.of(inputs).toMap(Functions.identity(),
                          s -> {
                            try {
                              return new BigIntger(1, MessageDigest.getInstance("MD5")
                                         .digest(s.getBytes(StandardCharsets.UTF_8))));
                             } catch (NoSuchAlgorithmException e) {
                               throw new RuntimeException(e);
                             }).etc...;

事实证明,对于这种情况,因为我知道输入是唯一的,所以我可以使用可用的 grouping collector 类似地执行此操作:

inputs.stream().collect(
    toConcurrentMap(Functions.identity(),
                    s -> {
                      try {
                        return new BigIntger(1, MessageDigest.getInstance("MD5")
                                   .digest(s.getBytes(StandardCharsets.UTF_8))));
                       } catch (NoSuchAlgorithmException e) {
                         throw new RuntimeException(e);
                       }).etc...;

【讨论】:

    猜你喜欢
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    相关资源
    最近更新 更多