Java 使用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是单个值,因此对于流来说,这不是一个好的用例

如何使用Java 8 lambdas将
字符串
转换为
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()加快速度。”米莎:你是对的。这说明了如何做对。当然,如果你把它看作是生产代码,那当然毫无意义,但我认为从中可以学到一些东西……是的,你当然是正确的。我应该在我的答案中做到这一点。然而我觉得米莎的答案比我的更清楚。(正确地说)这是一个毫无意义的智力练习。我提出的最重要的一点可能是在第一句话中。