使用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规格没有区别。它可能有用,但这并不意味着它是正确的;这段对话已经结束。