Java 使用Lambdas将字符串转换为整数值
如何使用Java 8 lambdas将Java 使用Lambdas将字符串转换为整数值,java,lambda,java-8,Java,Lambda,Java 8,如何使用Java 8 lambdas将字符串转换为int值 我曾尝试像这样将字符串转换为IntStream,并在其上应用方法mapToInt,但它给出了错误 int x = "582564625".chars().boxed().mapToInt(???) 我真正想要的是,将“582564625”转换为int值,并将其存储在变量x中 在上面的一行中,我应该用什么替换??Java 8流用于值流,而不是单个值。在您的例子中,原始的字符串和int是单个值,因此对于流来说,这不是一个好的用例
字符串
转换为int
值
我曾尝试像这样将字符串
转换为IntStream
,并在其上应用方法mapToInt
,但它给出了错误
int x = "582564625".chars().boxed().mapToInt(???)
我真正想要的是,将“582564625”转换为int
值,并将其存储在变量x
中
在上面的一行中,我应该用什么替换
?
?Java 8流用于值流,而不是单个值。在您的例子中,原始的字符串
和int
是单个值,因此对于流来说,这不是一个好的用例
例如,如果您想将字符串转换为其数字集,则可以对可能使用流的数字求和
numberString.chars().map(n -> Character.digit(n, 10)).sum();
但为了明确回答您的问题,如果您特别想转换为数字,然后再转换回整数,您可以:
int n = numberString.chars()
.map(n -> Character.digit(n, 10))
.reduce(0, (n, d) -> n * 10 + d);
但这可能是毫无意义的,因为它看起来 虽然提供了一个在顺序上下文中工作的解决方案,但所提供的函数违反了任务规定。一旦您开始使用流,此操作就会失败
如果您尝试处理输入值<代码> 1000 ,则不能使用正确的关联函数使用<代码> int >代码>值。您不能单独处理10
和00
,然后加入它们的结果
要解决这个问题,您需要一个同时携带实际数值和相关位数的值。如果值类型是不可变的或至少被视为不可变的,则可以将reduce
与此类值类型一起使用。这意味着每个操作都可能创建实例,因此我更喜欢使用另一种方法,即使用一个包含当前值和位数的可变容器。如果我们不想为此引入一个新的类,我们可以简单地使用长度为2的int[]
数组:
int iValue = numberString.chars()
.map(n -> Character.digit(n, 10))
.parallel()
.collect(()->new int[]{0,1},
(ia, v) -> { ia[0]=ia[0]*10 + v; ia[1]*=10; },
(ia1, ia2) -> { ia1[0]=ia1[0]*ia2[1]+ia2[0]; ia1[1]*=ia2[1]; })[0];
实际值在第一个元素中进行,位数在第二个元素中以因子的形式进行,当并行计算后必须合并两个容器时,需要因子
因此,第一个函数()->new int[]{0,1}
在调用第二个函数之前,为每个线程将使用的新容器实现供应商
,该函数使用已知的x=x*10+y
模式向容器添加一个值,并通过乘以因子来增加位数(最初是1
)由10
第三个函数将连接两个容器,并在两个线程完成其工作后调用。它将使用表示位数的因子用第二个容器的值更新第一个容器
毕竟,这确实是一个有趣的问题,可以演示流处理的原理,即使Integer.parseInt
对于所有字符串
长度来说都更简单,而且总是更快,对于这些长度,值仍然适合int
。应该注意的是,这个示例不检查任何错误条件,只检查o对非法字符进行胡说八道。你到底想实现什么?x的值应该是多少?有什么意义?只需使用Integer.parseInt
List List List=Stream.of(“12345”).map(Integer::parseInt).collect(Collectors.toList())
但为什么?@bhuvesh这是对lambda的滥用。如果你想学习lambda,你还可以用lambda做其他事情。lambda对此没有用处。它比毫无意义更糟糕。(n,d)->n*10+d
不是一个关联函数,因此违反了reduce
的约定。要破坏此实现,只需有人说“嘿,让我们用.parallel()加快速度。”米莎:你是对的。这说明了如何做对。当然,如果你把它看作是生产代码,那当然毫无意义,但我认为从中可以学到一些东西……是的,你当然是正确的。我应该在我的答案中做到这一点。然而我觉得米莎的答案比我的更清楚。(正确地说)这是一个毫无意义的智力练习。我提出的最重要的一点可能是在第一句话中。