大家好,感谢大家的帮助。
我有一个Stream<String>
,其中一个字符串可以是&#34; 1 + 5 * 2-4&#34; // = 8(如果我从左到右计算它就可以了)
此操作没有问题,但我现在只尝试使用Streams。这意味着我只需要使用像filter,reduce,collect这样的流操作......
我在最近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);
更新: 我可能解释得很糟糕。最终结果必须提供流操作。在这个流操作中,我们可以调用辅助方法。
答案 0 :(得分:0)
工作解决方案,通过@Turing85
修正了拼写错误Java-8 Stream-API对于一切都不是一个神奇的子弹,我看不到任何使用lambda表达式的简单解决方案。
我建议你坚持程序化的方式:
String string = "1+5*2-4";
String[] operator = a.split("[0-9]+");
String[] digits = a.split("[+-\\/*]");
int reduced = Integer.parseInt(digits[0]);
for (int i = 1; i < digits.length; i++) {
if (operator[i].equals("+")) { reduced += Integer.parseInt(digits[i]); }
else if (operator[i].equals("/")) { reduced /= Integer.parseInt(digits[i]); }
else if (operator[i].equals("*")) { reduced *= Integer.parseInt(digits[i]); }
else if (operator[i].equals("-")) { reduced -= Integer.parseInt(digits[i]); }
}
此解决方案仅简化为整数,没有输入和字符序列检查。 reduced
的数量会产生8
。顺便说一句,不要忘记用/
两次转义\\
字符,因为它在正则表达式中具有特殊含义。
如果你真的坚持使用基于Stream-API的解决方案给出了相同的结果,那么你可以去:
String a = "1+5*2-4";
System.out.println(a);
String[] operator = a.split("[0-9]+");
String[] digits = a.split("[+-\\/*]");
final int[] index = {0};
int reduced = Stream.of(digits)
.mapToInt(Integer::parseInt)
.reduce(0, (int t, int u) ->
{
int result = Integer.parseInt(digits[0]);
int i = index[0];
if (operator[i].equals("+")) { result = t + u; }
else if (operator[i].equals("/")) { result = t / u; }
else if (operator[i].equals("*")) { result = t * u; }
else if (operator[i].equals("-")) { result = t - u; }
index[0]++;
return result;
});
我希望你现在可以比较两个结果,看看哪一个在简洁性和可维护性方面获胜,这在我看来比显示你对Stream-API和lambda表达的好处更重要。但是,如果您挑战自己以了解有关Stream-API的更多信息,我建议您尝试查找其他用例。 :)
编辑:此外,您应该将操作员数字处理隐藏到方法:
public static int process(int identity, int t, int u, String[] array, int index) {
int result = identity;
if (array[index].equals("+")) { result = t + u; }
else if (array[index].equals("/")) { result = t / u; }
else if (array[index].equals("*")) { result = t * u; }
else if (array[index].equals("-")) { result = t - u; }
return result;
}
然后我可能会承认Stream-API不是一个糟糕的选择。
String a = "1+5*2-4";
System.out.println(a);
String operator[] = a.split("[0-9]+");
String digits[] = a.split("[+-\\/*]");
final int[] index = {0};
int reduced = Stream.of(digits).mapToInt(Integer::parseInt).reduce(0, (int t, int u) -> {
int result = process(Integer.parseInt(digits[0]), t, u, operator, index[0]);
index[0]++;
return result;
});