当前位置: 首页 > 面试题库 >

就像我们在Java流中执行流水线一样,如何在JavaScript中执行操作?

逄兴昌
2023-03-14
问题内容

在使用流的Java 8中,当我一个接一个地链接方法时,将以流水线方式执行操作。

例:

List<Integer> nums = Arrays.asList(1,2,3,4,5,6);    
nums.stream().map(x->{
    x = x * x;
    System.out.println("map1="+x);
    return x;
}).map(x->{
    x = x * 3;
    System.out.println("map2="+x);
    return x;
}).forEach(x-> System.out.println("forEach="+x));

输出:-

map1=1
map2=3
forEach=3
map1=4
map2=12
forEach=12
map1=9
map2=27
forEach=27
map1=16
map2=48
forEach=48
map1=25
map2=75
forEach=75
map1=36
map2=108
forEach=108

但是当我在javascript中尝试类似的时候,结果却不同。正如在javascript中一样,第一个操作完成,然后执行第二个操作。例如:-

var nums = [1,2,3,4,5,6 ];
nums.map(x => {
  x = (x * x);
  console.log('map1='+x);
  return x;})
  .map(x => {
  x = x * 3;
  console.log('map2='+x);
  return x;})
  .forEach(x=> console.log('forEach='+x));

输出:-

 map1=1
 map1=4
 map1=9
 map1=16
 map1=25
 map1=36
 map2=3
 map2=12
 map2=27
 map2=48
 map2=75
 map2=108
 forEach=3
 forEach=12
 forEach=27
 forEach=48
 forEach=75
 forEach=108

JavaScript中有什么方法可以使其以管道方式执行操作,并且可以像Java程序一样获得输出?

这个问题仅询问如何像JavaScript那样进行收集,而不询问相同类型方法的内部工作方式如何变化。


问题答案:

也许以后(或永远不会),您可以使用实际的 实验
管道运算符|>,其语法如下:

expression |> function

通过将函数作为单独的函数并为每个管道迭代流数组,可以实现所需的结果。

仅在FF中有效。 从版本58开始:此功能位于--enable-pipeline-operator编译标志的后面。

const

    a = x => { x = x * x; console.log("map1=" + x); return x; },

    b = x => { x = x * 3; console.log("map2=" + x); return x; },

    c = x => console.log("forEach=" + x)



var nums = [1, 2, 3, 4, 5, 6];



nums.forEach(v => v |> a |> b |> c);

管道功能相同(功能组合启用管道),并关闭了所需功能。

const

    pipe = (...functions) => input => functions.reduce((acc, fn) => fn(acc), input),

    a = x => { x = x * x; console.log("map1=" + x); return x; },

    b = x => { x = x * 3; console.log("map2=" + x); return x; },

    c = x => console.log("forEach=" + x)



var nums = [1, 2, 3, 4, 5, 6],

    pipeline = pipe(a, b, c);



nums.forEach(pipeline);


 类似资料:
  • 问题内容: 我正在使用rub redis宝石。想知道我是否例如: 这样的执行顺序得到保证吗? 问题答案: 当然可以保证顺序,否则流水线将毫无用处。您可以随时查看代码。例如,此测试明确假定命令是按顺序执行的:https : //github.com/redis/redis- rb/blob/master/test/pipelining_commands_test.rb#L32

  • 在阅读关于流的留档时,我遇到了以下句子: > 。。。试图从行为参数访问可变状态会给您带来错误的选择。。。如果您不同步对该状态的访问,您将面临数据竞争,因此您的代码将被破坏。。。[1] 如果行为参数确实有副作用。。。[没有]保证在同一个线程中执行同一流管道中“相同”元素上的不同操作。[2] 对于任何给定的元素,可以在库选择的任何时间和线程中执行该操作。[3] 这些句子没有区分顺序流和平行流。因此,我

  • 例如,您有一个要转换为JSONObject的pojo列表。你有一个POJO的列表。但是为了转换为JSONObject,您需要使用JSONObject put方法。 如果我只想做一个手术,我就可以做

  • 因为在过滤2之后,我们还得再找到一个元素来分层极限(2),操作,那么为什么输出不像我解释的那样呢?

  • 产出: 谢谢,参考:https://winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples/

  • 请考虑以下代码: 任务是应该并行执行的运行表的列表。当我们启动这个线程,并且它开始执行时,根据一些计算,我们需要中断(取消)所有这些任务。 中断线程只会停止执行中的一个。我们怎么对付别人?或者流不应该这样使用?或者你知道更好的解决办法?