Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 映射到多个值(如元组)时是否有BiConsumer的相反形式_Java_Tuples_Java Stream - Fatal编程技术网

Java 映射到多个值(如元组)时是否有BiConsumer的相反形式

Java 映射到多个值(如元组)时是否有BiConsumer的相反形式,java,tuples,java-stream,Java,Tuples,Java Stream,我试图将字符串流映射到这些字符串的散列,同时将字符串也保留在输出中。最后,我将散列转换为字符串,以便可以映射到字符串[],甚至可以将它们作为一个字符串连接在一起。我更希望lambda的输出既可以是字符串也可以是字节[]避免一次转换。如果不定义一个特定的值对象来保存这两个值,是否存在一种互惠的BiConsumer,即双生产者 public static final ArrayList<String> inputs; // ... initialized elsewhere ... in

我试图将字符串流映射到这些字符串的散列,同时将字符串也保留在输出中。最后,我将散列转换为字符串,以便可以映射到
字符串[]
,甚至可以将它们作为一个字符串连接在一起。我更希望lambda的输出既可以是
字符串
也可以是
字节[]
避免一次转换。如果不定义一个特定的值对象来保存这两个值,是否存在一种互惠的
BiConsumer
,即双生产者

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]; ...});
公共静态最终ArrayList输入;//。。。在别处初始化
...
inputs.parallelStream().map(s->{
试一试{
字符串h=String.format(“%032x”,
新的biginger(1,MessageDigest.getInstance(“MD5”)
.digest(s.getBytes(StandardCharsets.UTF_8));
字符串[]r={s,h};
返回r;
}捕获(无算法异常){
抛出新的运行时异常(e);
}
}).foreach(tuple->{String input=tuple[0],hash=tuple[1];…});

你看,如果在
foreach
中我想要一个哈希的
字节[]
,我希望传递我在
映射中已经拥有的内容,否则我将转换成一个字符串和一个字符串,只是为了方便地传递它。显然,如果我制作一个类来容纳这两种类型,那将是一个费劲的解决方案;对于将步骤映射到下游的多个值,是否存在预先存在的启示?

除了对
双消费者的困惑之外,感谢您在评论中的建议。看起来它有一个非常好的方式来写这个:

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...;
事实证明,在这种情况下,因为我知道输入是唯一的,所以我可以用可用的:


除了对
双消费者的困惑
,感谢您在评论中的建议。看起来它有一个非常好的方式来写这个:

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...;
事实证明,在这种情况下,因为我知道输入是唯一的,所以我可以用可用的:


你的问题自相矛盾。一个
BiConsumer
消费了两个项目,但没有产生任何东西。相反,假设的
BiSupplier
,会产生两个项目而不消耗任何东西,这对于
map
操作是不合适的,该操作需要
函数
,该函数消耗一个项目并产生一个项目,因此
函数
的对立面也是
函数
。其他任何东西都是无用的,因为
map
需要
函数
参数,因此您必须提供
函数
参数,而不进行任何讨论……在当前技术水平下,将这两个值装箱到另一个对象是不可避免的,但是如果您正在寻找一种更令人愉快的编码方式,你可以试试。你的问题自相矛盾。一个
BiConsumer
消费了两个项目,但没有产生任何东西。相反,假设的
BiSupplier
,会产生两个项目而不消耗任何东西,这对于
map
操作是不合适的,该操作需要
函数
,该函数消耗一个项目并产生一个项目,因此
函数
的对立面也是
函数
。其他任何东西都是无用的,因为
map
需要
函数
参数,因此您必须提供
函数
参数,而不进行任何讨论……在目前的技术水平下,将这两个值装入另一个对象是不可避免的,但如果您正在寻找一种更令人愉快的编码方式,您可以尝试。