Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.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流对concat字符串执行算术运算_Java_Lambda_Java Stream_Reduce - Fatal编程技术网

使用Java流对concat字符串执行算术运算

使用Java流对concat字符串执行算术运算,java,lambda,java-stream,reduce,Java,Lambda,Java Stream,Reduce,大家好,谢谢大家的帮助 我有一个流,其中字符串可以是“1+5*2-4”//=8(如果我从左到右计算它就可以了) 这个操作没有问题,但我现在尝试只使用流。这意味着我只需要使用流操作,如筛选、减少、收集 我试了6个小时都不知道。不允许在这个方向上建立列表和分析元素或其他东西。一个流操作或多个流操作必须直接给我一个最终结果 有人有什么想法吗 我最好的尝试是 Stream<String> numbers = myList.stream().filter(s -> Charac

大家好,谢谢大家的帮助

我有一个
,其中字符串可以是“1+5*2-4”//=8(如果我从左到右计算它就可以了)

这个操作没有问题,但我现在尝试只使用流。这意味着我只需要使用流操作,如筛选、减少、收集

我试了6个小时都不知道。不允许在这个方向上建立列表和分析元素或其他东西。一个流操作或多个流操作必须直接给我一个最终结果

有人有什么想法吗

我最好的尝试是

  Stream<String> numbers = myList.stream().filter(s -> 
  Character.isDigit(s.charAt(0)));
  List<String> operands = myList.stream().filter(s -> 
  !Character.isDigit(s.charAt(0))).collect(Collectors.toList());



   String result = numbers.reduce((a, b) -> {
   int iA = Integer.parseInt(a);
   int iB = Integer.parseInt(b);

   String operation = operands.get(0);
   operands.remove(0);
   return calc(iA,iB,operation);


  }).get();

  System.out.println(result);
Stream number=myList.Stream().filter(s->
字符.isDigit(s.charAt(0));
列表操作数=myList.stream().filter(s->
!Character.isDigit(s.charAt(0)).collect(collector.toList());
字符串结果=数字。减少((a,b)->{
int iA=Integer.parseInt(a);
int iB=整数。parseInt(b);
字符串操作=操作数。获取(0);
操作数。删除(0);
返回计算(iA、iB、操作);
}).get();
系统输出打印项次(结果);
更新:
我可能解释得不好。最终结果必须交付流操作。在这个流操作中,我们可以调用helper方法。

工作解决方案,由于@Turing85

Java-8流API并不是万能的,我看不到任何使用lambda表达式的简单解决方案

我建议你坚持按程序办事:

String String=“1+5*2-4”;
字符串[]运算符=a.split(“[0-9]+”);
字符串[]位=a.split(“[+-\\/*]”);
int reduced=Integer.parseInt(数字[0]);
对于(int i=1;i
此解决方案仅简化为整数,无需输入和字符序列检查。减少的
数量将导致
8
。顺便说一下,不要忘记用
\\
转义
/
字符两次,因为它在正则表达式中有特殊的含义


如果您真的坚持使用基于流API的解决方案,该解决方案会产生非常相同的结果,那么您可以这样做:

String a=“1+5*2-4”;
系统输出打印项次(a);
字符串[]运算符=a.split(“[0-9]+”);
字符串[]位=a.split(“[+-\\/*]”);
最终int[]索引={0};
int reduced=流(位数)
.mapToInt(整数::parseInt)
.减少(0,(整数t,整数u)->
{
int result=Integer.parseInt(数字[0]);
int i=指数[0];
if(运算符[i].=(“+”){result=t+u;}
else如果(运算符[i].=(“/”){result=t/u;}
else如果(运算符[i].equals(“*”){result=t*u;}
else如果(运算符[i].equals(“-”){result=t-u;}
索引[0]++;
返回结果;
}); 
我希望现在您可以比较这两个结果,看看哪一个在简洁性和可维护性方面获胜,在我看来,这比展示您在流API和lambda表达式方面有多好更重要。但是,如果您为了了解更多关于流API的信息而挑战自己,我建议您尝试寻找其他用例。:)


编辑:此外,应将运算符数字处理隐藏到以下方法:

公共静态int进程(int-identity、int-t、int-u、String[]数组、int-index){
int结果=身份;
如果(数组[index].equals(“+”){result=t+u;}
如果(数组[index].equals(“/”){result=t/u;}
如果(数组[index].equals(“*”){result=t*u;}
如果(数组[index].equals(“-”){result=t-u;}
返回结果;
}
那么我可能承认流API是一个不错的选择

String a=“1+5*2-4”;
系统输出打印项次(a);
字符串运算符[]=a.split(“[0-9]+”);
字符串数字[]=a.split(“[+-\\/*]”);
最终int[]索引={0};
int reduced=Stream.of(digits).mapToInt(Integer::parseInt).reduce(0,(int t,int u)->{
int result=process(整数.parseInt(数字[0]),t,u,运算符,索引[0]);
索引[0]++;
返回结果;
}); 

如果没有流,您怎么做?我想你也会用同样的方法处理流。流API不是一个神奇的子弹。它不可能减少混合操作流,因为它不是关联的。@shmosel这对并行流很重要,但我认为按顺序运行是可以的only@Eugene规格没有区别。它可能有用,但这并不意味着它是正确的;这段对话已经结束。